二维数组动态内存分配崩溃

可能重复:
如何在C中正确设置,访问和释放多维数组?

我正在尝试使用calloc为2D数组动态分配内存。 列固定为2,因此它只是动态的行。

这是我一直在尝试的:

unsigned int **pts, rows; int main() { //some code pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **)); } //The code to access the array : for(k=1;k<=i;k++) { printf("\nX%d=",k); scanf("%d",&pts[k][0]); printf("\nY%d=",k); scanf("%d",&pts[k][1]); } 

但问题是,在访问arrays时,程序崩溃了。 我正在使用Eclipse和MinGW GCC。

如果我需要在这里提供更多数据或者让我知道如何处理这个问题,请告诉我,因为这是我的第一篇文章。

都铎的答案是正确的解决方案。 但是要更深入地了解您的代码错误的原因….

你的代码真正做的只是分配一个长度为2 *行的指向指向int类型的指针的数组。

你想要创建的是:

 an array of int** -> int* -> int -> int -> int -> ...more -> int* -> int -> int -> int -> ...more -> int* -> int -> int -> int -> ...more -> ...more 

你实际创建的是这样的:

 an array of int** -> int* -> nothing (null address) -> int* -> nothing... -> ...more 

然后尝试将int分配给int **数组中零初始化int *之一指向的地址之一(你看,calloc确保你的所有int *都为零)

当你试图执行

 scanf("%d",&pts[k][0]); 

pts [k]指的是int **数组中的第(k-1)个元素,但是如上所示,虽然你的代码确实为这个元素分配了空间,但是它已经将它初始化为零。 所以,这个pts [k]指向NULL。 因此,scanf已经根据与NULL地址的零偏移获得了一个地址……现在应该清楚这是无效的。

这是做到这一点的方法:

 pts = (unsigned int **)calloc(rows, sizeof (unsigned int *)); for(int i = 0; i < rows; i++) { pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int)); }