二维数组动态内存分配崩溃[重复]
Posted
技术标签:
【中文标题】二维数组动态内存分配崩溃[重复]【英文标题】:2D array dynamic memory allocation crashes [duplicate] 【发布时间】:2012-10-09 00:11:27 【问题描述】:可能重复:How do I correctly set up, access, and free a multidimensional array in C?
我正在尝试使用 calloc 为二维数组动态分配内存。列固定为 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]);
但问题是,在访问数组时,程序崩溃了。 我正在使用带有 MinGW GCC 的 Eclipse。
如果我需要在这里添加更多数据或告诉我如何处理这个问题,请告诉我,因为这是我的第一篇文章。
【问题讨论】:
How do I correctly set up, access, and free a multidimensional array in C? 你能把你访问数组的代码贴出来吗? 【参考方案1】:都铎王朝的答案是正确的解决方案。 但是为了更深入地了解您的代码错误的原因......
您的代码实际上在做的只是分配一个长度为 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* 之一所指向的 null 地址之一em>**(你看,calloc 已经确保你所有的 int* 都是零)
当你试图执行时
scanf("%d",&pts[k][0]);
pts[k] 指的是 int** 数组中的第 (k - 1) 个元素,但如上所示,尽管您的代码确实为该元素分配了空间,但它具有将其初始化为零。所以,这个 pts[k] 指向 NULL。所以 scanf 已经获得了一个基于 NULL 地址的零偏移量的地址......现在你应该清楚这是无效的。
【讨论】:
感谢清晰的图片! @Nik,不客气。我记得我在大学一年级时犯过同样的错误...... lolz【参考方案2】:方法如下:
pts = (unsigned int **)calloc(rows, sizeof (unsigned int *));
for(int i = 0; i < rows; i++)
pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int));
【讨论】:
感谢都铎王朝!还有一个问题。我不能写 2*rows 并且只使用一次 calloc 吗? @Nik:不是真的,如果你使用指向指针的指针,你需要单独分配每一行。 再次感谢。我需要学习更多:) 在 C 中,所有这些演员都是无用的。以上是关于二维数组动态内存分配崩溃[重复]的主要内容,如果未能解决你的问题,请参考以下文章