2017-04-24 97 views
-1

我用這個簡單的代碼得到了一個奇怪的「分段錯誤:11」,無法弄清楚問題所在。我只需要動態聲明和大小爲nrows x ncolumns的數組。帶calloc的簡單二維數組導致分段錯誤

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    int nrows = 3; 
    int ncolumns = 5; 

    int **array; 
    array = calloc(nrows, sizeof(int)); 
    for(int i = 0; i < nrows; i++) 
    { 
     array[i] = calloc(ncolumns, sizeof(int)); 
     if(array[i] == NULL) 
     { 
      fprintf(stderr, "out of memory\n"); 
      exit(-1); 
     } 
    } 

    for(int i = 0; i < nrows; i++) 
    { 
     for(int j = 0; j < ncolumns; j++) 
     { 
      array[i][j] = 10; 
      printf("%d %d: %d\n",i,j, array[i][j]); 
     } 
    } 
    return 0; 
} 
+4

'array = calloc(nrows,sizeof(int));' - >'array = calloc(nrows,sizeof(int *));' – BLUEPIXY

+0

是的,就是這樣!謝謝。 – Miguel

+1

代碼中沒有2D數組。指針不是數組。 – Olaf

回答

4

你在混合你的隱喻。你聲明你的數組是一個指向指針塊的指針,但是然後分配大小爲int的內存塊。你可能會忽略這個地方,指針的大小是int的大小,但它仍然不正確。

最簡單的選擇是使它成爲一個簡單的一維數組,您可以使用行和列步幅訪問(即array[row*ncolumns + column]),或者在整個過程中更全面地使用指針。

請注意,由於編譯器不知道內部數組的大小,因此無法使用doubled up數組語法來訪問此類動態分配的二維數組,因此,外部數組的步幅也是如此。

+0

好的,感謝您的評論。 – Miguel