二维数组动态内存分配崩溃[重复]

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 中,所有这些演员都是无用的。

以上是关于二维数组动态内存分配崩溃[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用动态内存分配创建二维数组

C语言动态分配二维字符串数组

指向动态二维字符数组的三重指针的内存分配

c++ 动态分配二维数组 new 二维数组

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

如何在 C++ 中为二维对象数组分配内存? [复制]