二维数组动态内存分配崩溃
可能重复:
如何在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)); }