2D阵列的动态内存分配

时间:2014-07-27 16:53:47

标签: c arrays malloc multidimensional-array

我想为2D数组动态分配内存。

这两者有什么区别吗?

1)

array = (int**)malloc(size * sizeof(int*));
for (i = 0; i < size; i++) {
    array[i] = (int *) malloc(size * sizeof(int));
}

2)

array = (int**)malloc(size *size* sizeof(int));

如果是,有什么好用的?为什么?

3 个答案:

答案 0 :(得分:2)

在第一种情况下

array = (int**)malloc(size * sizeof(int*));
for (i = 0; i < size; i++) {
    array[i] = (int *) malloc(size * sizeof(int));
}

您正在分配大小等于size的{​​{1}}范围。那就是您要分配大小的一维数组。因此,您将分配指向这些一维数组的第一个元素的大小指针。

在第二种情况表达式中

size * sizeof( int )

表示分配大小的范围* int类型的对象的大小,返回的指针被解释为(int**)malloc(size *size* sizeof(int)) 。所以这个表达式没有意义,取决于赋值左侧的内容。考虑到指针的大小可能大于int的大小。

您可以改为编写

int **

在这种情况下,如果size是一个常量表达式,你确实会分配一个二维数组。

答案 1 :(得分:0)

这两种解决方案非常不同。第一个将为您提供向量指针的向量。第二个将为您提供所需大小的向量。这一切都取决于您的用例。你想要哪个?

当谈到释放内存时,第一个只能通过为向量中的每个指针调用free而释放,然后在向量本身上释放最后一个。第二个可以通过一次调用释放。不要那是你决定使用其中一个的理由。这一切都取决于你的用例。

您要分配的对象的类型是什么?它是int **,int * []还是int [] []?

答案 2 :(得分:0)

  

我想为二维数组动态分配内存。

然后就这样做

int (*arr)[size] = malloc(size * sizeof *arr);
  

这两者有什么区别吗?

是的,因错误不同而错了。第一次尝试不分配2D数组,它分配一个指针数组,然后分配一堆int s的数组。因此,结果在内存中不一定是连续的(无论如何,指向指针的指针与二维数组不同。)

第二段代码确实分配了一个连续的内存块,但是你把它当作一个指向指针的对象,它仍然不是同一个东西。

哦,实际上,两个片段都有一个共同的错误:转换malloc()的返回值。