繁体   English   中英

2D数组的动态内存分配

[英]Dynamic memory allocation for 2D 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));

如果是,什么更好使用,为什么?

在第一种情况下

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

您正在分配的size范围等于size * sizeof( int )大小,即您正在分配大小的一维数组。 因此,您正在分配指向这些一维数组的第一个元素的大小指针。

在第二种情况下

(int**)malloc(size *size* sizeof(int))

表示分配一个size * int类型的对象的大小范围,并将返回的指针解释为int ** 因此,此表达式不依赖于赋值左侧的内容。 考虑到指针的大小可以大于int的大小。

你可以写

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

在这种情况下,您确实要分配一个二维数组,前提是size是一个常量表达式。

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

释放内存时,只能通过对向量中的每个指针进行释放,然后对向量本身进行最终释放来释放第一个。 第二个可以通过一次调用释放。 没有那是您决定使用其中一个的决定性理由。 这完全取决于您的用例。

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

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

然后就做

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

两者之间有什么区别吗?

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

第二段代码确实分配了一个连续的内存块,但是随后您将其视为指针对指针,这仍然是不一样的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM