【问题标题】: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。

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

【问题讨论】:

标签: c calloc dynamic-allocation


【解决方案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 中,所有这些演员都是无用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2020-07-11
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多