【发布时间】:2016-10-12 11:33:46
【问题描述】:
如果我有一个二维数组分配如下:
int** map;
map = malloc(number * sizeof(int*));
if(!(map)){
printf("out of memory!\n");
return 1;
}
for (int i = 0; i < number; i++){
map[i] = malloc(number * sizeof(int));
if (!(map[i])){
printf("Not enough memory!\n");
return 1;
}
}
如果分配失败并且我们在 if 语句中输入,我应该释放映射和分配到现在的“列”吗?如果是这样,我应该怎么做?
现在我只是打印消息并返回 1 但我不确定这是否是正确的方法。
【问题讨论】:
-
您没有二维数组。那是一个基于指针的查找表。要分配 2D 数组,您必须使用
int (*map)[number] = malloc(sizeof (int[number][number]));或等效项。区别,即二维数组的数据分配在相邻的内存单元中,理解这一点非常重要。 -
别忘了检查外层malloc的返回值。
-
@Lundin 哦,我不知道,除了数据分配方式不同之外,在如何使用它们/速度方面还有其他差异吗?
-
@user464502 我忘记了,已修复。谢谢
-
@JohnSmith 您使用的方法的唯一优点是它允许查找表的每个“维度”获得与其他“维度”不同的大小,并在运行时更改大小。缺点是您的方法会导致堆分段,由于缓存未命中和不必要的复杂代码导致程序慢得多,这些代码可能会导致错误和内存泄漏。此外,您的代码的实际分配时间要慢得多。