循环

时间:2015-10-23 08:59:46

标签: c segmentation-fault dynamic-arrays

我研究过数据结构和算法,我遇到了动态二维数组的问题。这是我的代码的一部分。编码问题是奈特的巡演。

int iMove[8] = {-2, -1, 1, 2, 2,  1, -1, -2};
int jMove[8] = { 1,  2, 2, 1,-1, -2, -2, -1};


cell* cellList(int* i, int* j, int** board){
    int k;
    cell* temp;
    int iTempNext; int jTempNext;
    int maxSampleNum = 8;
    int cnt = 0;    
    int val;

    for(k = 0; k < maxSampleNum; k++){
        iTempNext = (*i) + iMove[k];
        jTempNext = (*j) + jMove[k];

        //1. get list 0<=i<=7 && 0<=j<=7
        if( (0 <= iTempNext && iTempNext <= 7) && (0 <= jTempNext && jTempNext <= 7)){
        //2. get the 0 value cells
            //val = canMove(iTempNext, jTempNext, board);
            printf("%d %d\n", iTempNext, jTempNext);
            if(board[iTempNext][jTempNext] == 0){
                cell tempCell;
                tempCell.row = iTempNext;
                tempCell.col = jTempNext;
                temp = (cell*)realloc(temp, sizeof(cell));
                *(temp+cnt) = tempCell;
                cnt++;

            }

        }

    }

    return temp;
}

int ** board:2d数组,我动态分配它,并将该数组的所有元素初始化为0.我在初始化后打印了2d数组。 问题是在第二次循环之后,该程序在访问二维数组时出现了分段错误。我在第3个for循环期间无法访问2d数组元素。

Initializing Complete...                                                                                                                                                               
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
0 0 0 0 0 0 0 0                                                                                                                                                                        
Enter the start position (i, j): 3 3  
iTempNext jTempNext                                                                                                                                             
1           4                                                                                                                                                                                    
2           5                                                                                                                                                                                    
4           5                                                                                                                                                                                    

Program received signal SIGSEGV, Segmentation fault.                                                                                                                                   
0x0000000000400b1c in cellList (i=0x7fffffffe5bc, j=0x7fffffffe5c0, board=0x603010) at main.c:144                                                                                      
144                             if(board[iTempNext][jTempNext] == 0){    

这是使用gdb后的结果。我该如何解决这个问题

1 个答案:

答案 0 :(得分:2)

这一行:

temp = (cell*)realloc(temp, sizeof(cell));

调用未定义的行为,因为temp未初始化。您应该使用例如cell *temp = NULL;初始化它(了解realloc可以采用NULL指针,在这种情况下,它等同于malloc,或者先前malloced/calloced/realloced指针)。

并且不会从malloc 投出回报。这是C,而不是C ++。搜索此网站,了解为什么在C中不推荐使用malloc返回值。