我想为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));
如果是,有什么好用的?为什么?
答案 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()
的返回值。