SIGSEGV在C中访问结构参数

SIGSEGV在C中访问结构参数,c,struct,segmentation-fault,C,Struct,Segmentation Fault,我已经编写了一个基本的数据结构来解决C语言中的递归问题。我不明白为什么在一个特定的情况下我会出现分段错误,即使在其他情况下似乎工作得很好。 这里只是代码的主要部分:如果你有耐心,这就是完整的代码 typedef结构{ 炭色; int-val; }管道; typedef结构瓷砖; 结构砖{ 管道1; 管道2; 国际使用; }; 类型定义结构{ 瓷砖*瓷砖; 瓷砖*可能的瓷砖; int tileNum; 国际货币基金组织; }tileCollection; 类型定义结构{ 瓷砖*瓷砖过冬; 整数旋转

我已经编写了一个基本的数据结构来解决C语言中的递归问题。我不明白为什么在一个特定的情况下我会出现分段错误,即使在其他情况下似乎工作得很好。 这里只是代码的主要部分:如果你有耐心,这就是完整的代码

typedef结构{
炭色;
int-val;
}管道;
typedef结构瓷砖;
结构砖{
管道1;
管道2;
国际使用;
};
类型定义结构{
瓷砖*瓷砖;
瓷砖*可能的瓷砖;
int tileNum;
国际货币基金组织;
}tileCollection;
类型定义结构{
瓷砖*瓷砖过冬;
整数旋转;
}盒子;
类型定义结构{
盒子**板;
方框**solMax;
int nCol;
int nRow;
}木板纸;
无效findMax(boardWrap*boardWrap,tileCollection*文件列,整数列,整数行){
如果(col==(theBoardWrap->nCol-1)){//se sono到达alla fine della riga
如果(行==(木板包装->nRow-1)){//sono到达阿拉美好的德拉斯卡希拉
if(evaluateScore(theBoardWrap)){//se la soluzioneèmassima
theBoardWrap->solMax=theBoardWrap->board;//copio la soluzione max
}
返回;
}
findMax(theBoardWrap,theTileColl,0,row+1);//ricorro sulla riga successiva,alla prima colonna
}
if(board wrap->board[col][row].tilePointer!=NULL){//se la casellaègiáa occupta
findMax(theBoardWrap,theTileColl,col+1,row);//ricorro sulla colonna successiva
}
否则{//se la casellaèvoota
对于(int i=0;i<(theTileColl->tileNum*2);i++){//ciclo che scorre tutte le possibili piastrelle inseibili
如果(theTileColl->possibleTiles[i].inUse==0){//controllo se la posso mettere
theTileColl->possibleTiles[i].inUse=1;//la marco come inserita
//皮亚斯特雷拉插入术
Boardwrap->board[col][row].tilePointer=&theTileColl->possibleTiles[i];//inserisco la piastrella
findMax(theBoardWrap,theTileColl,col+1,row);//ricorro sulla colonna successiva
theTileColl->possibleTiles[i].inUse=0;//回溯
}
}
}
}
int evaluateScore(boardWrap*theBoardWrap){//ritorna'1'位于马克斯帕萨托马格里奥河谷,0'位于诺科斯河谷
int记分板1,记分板最大值;
scoreBoardMax=boardScoreCalc(BoardWrap,theBoardWrap->solMax);
记分板1=记分板计分卡(板包装,板包装->板);
如果(记分板1>记分板最大值){
返回1;
}
其他的
返回0;
}
int BoardScorec(boardWrap*boardWrap,box**board){//se passo la la la board by reference ho un SIGSEGV,se la passo by value no
int flagRowColor=0,flagColColor=0;
int-totScoreRow=0;
int-totScoreCol=0;
int行点[theBoardWrap->nRow],colPoints[theBoardWrap->nCol];
对于(int i=0;inRow;i++){
对于(int j=0;jnCol;j++){
//卡尔科洛·伊尔·蓬特吉奥·佩拉·里加
如果(j==0){//riga
行点[i]=board[i][j]。TilePoints->pipe1.val;
flagRowColor=1;
}
否则如果(匹配颜色(Boardwrap->board[i][j].tilePointer->pipe1.color,Boardwrap->board[i][j-1].tilePointer->pipe1.color)和&flagRowColor){
行点[i]+=board[i][j].tilePoints->pipe1.val;
}
否则{
行点[i]=0;
flagRowColor=0;
}
//卡尔科洛·伊尔·蓬特吉奥·佩尔·科隆
如果(i==0){//IO colonna
colPoints[j]=board[i][j].tilePointer->pipe2.val;
flagColColor=1;
}
否则如果(匹配颜色(Boardwrap->board[i][j].tilePointer->pipe1.color,Boardwrap->board[i-1][j].tilePointer->pipe1.color)和&flagColColor){//我得到了SEGSIGV
colPoints[j]+=board[i][j].tilePointer->pipe2.val;
}
否则{
colPoints[j]=0;
flagColColor=0;
}
}
}
对于(int i=0;inRow;i++){
totScoreRow+=行点数[i];
}
对于(int j=0;jnCol;j++){
totScoreCol*=colPoints[j];
}
返回totScoreCol+totScoreRow;
}

我用您的输入数据启动了您的程序。不管你的程序因为缺少输入文件而崩溃。但根据GDB输出,您的程序不会填充第241行的board Wrap->board[2][0]字段,并尝试取消引用它。我的建议是学习使用调试器(如GDB),使用
中的断言,非常准确地处理手动分配的内存,至少执行与
NULL
指针的比较,如下所示:

assert(theBoardWrap != NULL);
assert(theBoardWrap->board[i][j].tilePointer != NULL);
assert(theBoardWrap->board[i-1][j].tilePointer != NULL);

不,这绝对不是堆栈溢出。

分段错误发生在哪里?它发生在我调用“boardScoreCalc”函数中的函数“matchColor”时。递归函数
findMax
调用
evaluateScore
,然后调用
boardScoreCalc
,在其中定义了整数数组(
int rowPoints[theBoardWrap->nRow],colPoints[theBoardWrap->nCol];
),这可能会占用堆栈空间。总之,递归函数可能会导致堆栈溢出,一旦堆栈溢出,就会发出SIGSEGV信号。@YingyuYOU这与
matchColor
函数有什么关系?@YingyuYOU谢谢。调试我可以看到它在9次调用后发生(板中方框的编号),因此第一次调用
boardScoReCalc
。此外,我通过指针传递主结构…你认为它可能已经给我堆栈溢出吗?谢谢你的建议,我通常使用CLion调试器,GDB更好吗?我尝试过断言,但我没能抓住这个问题。