c - 二维数组动态内存分配崩溃

标签 c calloc dynamic-allocation

<分区>

Possible Duplicate:
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]);
}

但问题是,在访问数组时,程序崩溃了。 我将 Eclipse 与 MinGW GCC 结合使用。

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

最佳答案

都铎的答案是正确的解决方案。 但是为了更深入地了解为什么你的代码是错误的......

您的代码真正做的只是分配一个数组,长度为 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 分配给 null 地址之一,该地址由 intint* 之一指向em>**(你看,calloc 确保你所有的 int* 都是零)

当你试图执行

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

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

关于c - 二维数组动态内存分配崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12956290/

相关文章:

c - 由 C 代码制作的 mex 在循环中崩溃,但运行一次时不会崩溃

c++ - 如何使用参数化构造函数动态分配对象数组?

python - 如何更改 Spark 设置以允许 spark.dynamicAllocation.enabled?

c - 使用 calloc 将内存分配给 Struct 变量时出现段错误

python - 以附加模式打开文件并寻求开始

c++ - calloc 创建的数组未按预期运行

c++ - 删除双指针(矩阵)

mysql - C代码连接mysql

c - 分段故障

c - malloc 看起来不适用于我的程序