2010-05-07 197 views
2

好的,所以我有一個二維數組,用來自文件(格式:x y z)的值初始化。
我的文件正確讀入值,但是當將z值添加到矩陣/ 2DArray時,我遇到了段錯誤,我不知道爲什麼。這可能是不正確的使用指針?我還沒有完成他們的任務。初始化二維數組

這是我的初始化器,做工精細,甚至初始化所有「Z」值0

int** make2DArray(int rows, int columns) 
{ 
    int** newArray; 
    newArray = (int**)malloc(rows*sizeof(int*)); 
    if (newArray == NULL) 
    { 
     printf("out of memory for newArray.\n"); 
    } 
    for (int i = 0; i < rows; i++) 
    { 
     newArray[i] = (int*)malloc(columns*sizeof(int)); 
     if (newArray[i] == NULL) 
     { 
      printf("out of memory for newArray[%d].\n", i); 
     } 
    } 

    //intialise all values to 0 
    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < columns; j++) 
     { 
      newArray[i][j] = 0; 
     } 
    } 

    return newArray; 
} 

這是我如何調用初始化器(和解決問題的功能)。

int** map = make2DArray(rows, columns); 
fillMatrix(&map, mapFile); 

這就是問題代碼。

void fillMatrix(int*** inMatrix, FILE* inFile) 
{ 
    int x, y, z; 
    char line[100]; 
    while(fgets(line, sizeof(line), inFile) != NULL) 
{ 
    sscanf(line, "%d %d %d", &x, &y, &z); 
    *inMatrix[x][y] = z; 
} 
} 

從我可以通過使用DDD的收集,問題就來當y到達47
的地圖文件有一個最大的「x」的47值以及63最大「Y」值,我很確定我沒有把訂單混淆,所以我不知道該程序爲什麼是segfault-ing?我敢肯定,這是一個新手的錯誤...

+0

將陣列構建爲陣列陣列會導致性能下降,原因有三。 1:查找一個元素需要兩次內存訪問(1獲取行指針,然後另一個查找行中的值); 2:矩陣元素不是連續存儲的,這會損害緩存;和3:它阻止您使用BLAS等高性能矩陣庫。 – amaurea 2017-07-29 10:08:04

回答

3

下標比引用操作更高的優先級,所以你需要一對括號:

(*inMatrix)[x][y] = z; 

然而,隨着你的使用情況,您可以只直接將int**傳遞給fillMatrix;額外的間接是不必要的。

+0

加上括號仍然給出了段錯誤,具體的行是我們所指的:* inMatrix [x] [y] = z;然而我不明白爲什麼它一直添加到y = 46,然後y = 47給出了段錯誤。 另請注意,make2DArray和fillMatrix方法在名爲map.c的文件中,而對它們的調用來自不同的文件。 – FizzBuzz 2010-05-07 03:09:26

+0

@TeeJay:您需要確保測試'sscanf'的返回值以確保它成功,並且您需要檢查輸入值以確保它們在數組邊界內(永遠不要信任程序輸入)。 – 2010-05-07 03:59:08

+0

我相信我的問題是在矩陣的malloc中。我從i = 0循環到i FizzBuzz 2010-05-07 08:56:45