1

可能重复:
如何在 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]);
}

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

请让我知道是否需要在此处放置更多数据或告诉我如何处理此问题,因为这是我的第一篇文章。

4

2 回答 2

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 * 之一所指向的地址之一(您会看到,calloc 已确保您的所有int * 都为零)

当你试图执行

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

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

于 2012-10-18T13:58:47.010 回答
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));
}
于 2012-10-18T13:55:02.347 回答