2D阵列动态内存分配崩溃

时间:2012-10-18 13:50:59

标签: c calloc dynamic-allocation

  

可能重复:
  How do I correctly set up, access, and free a multidimensional array in 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]);
}

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

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

2 个答案:

答案 0 :(得分:2)

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

你的代码实际上只是分配一个长度为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 地址之一 **(你看,calloc确保你所有的 int *都是零)

当您尝试执行

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

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

答案 1 :(得分:1)

这是做到这一点的方法:

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