2017-04-24 67 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