2015-10-23 97 views
0

我研究了數據結構和算法,並且我得到了動態二維數組的問題。這是我的代碼的一部分。編碼問題是騎士之旅。動態二維數組元素不能訪問幾個循環

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 **板:2D陣列和我動態分配它並初始化該數組中的所有元素爲0。我印刷二維數組初始化之後。 問題是在第二個for循環之後,這個程序在訪問2d數組時遇到了分段錯誤。我無法在3rd 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

請發佈您的其他功能,並創建一個最小,完整且可驗證的示例。 – Magisch

+0

'iMove [k]'和'jMove [k]',這些值來自哪裏? – CrakC

+0

@ user3121023感謝您的建議。我得到的教訓是認真使用'realloc()'。我幾次'realloc'後檢查'temp'空間覆蓋了其他內存空間。我改變我的邏輯,以獲得預期的數組長度和'malloc()'它。 – JSKIM

回答

2

這條線:

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

調用未定義行爲因爲temp未初始化。您應該使用例如cell *temp = NULL;(理解realloc可以採用NULL指針,在這種情況下,它相當於malloc或先前的malloced/calloced/realloced指針)對其進行初始化。

不投出從malloc回報。這是C,而不是C++。搜索此網站,爲什麼要鑄造malloc的返回值在C中不受歡迎。

+0

根據你的建議,我初始化了'cell * temp = NULL',這讓我很容易弄清楚數組是否爲NULL。這使我的代碼避免了運行時錯誤。 – JSKIM

+0

@JSKIM很高興聽到它。現在堆棧溢出的下一步是通過單擊左側箭頭下的複選標記來接受答案。這將爲您賺取2個學分。 – Jens