刚开始学习C并遇到了以下问题:
我需要缩小C中的整数数组,最后删除元素。通过删除我的意思是释放。常见的答案是为较小的数组分配新的内存,然后将原始数组的所有项(-items to remove)复制到新分配的内存中,然后free()原始数组。
因为我必须处理非常大型数组,所以我宁愿跳过复制部分。
是否有可能创建一个指向“接近原始数组末尾”的指针变量,其大小为“数组末尾 - 接近结尾”,然后释放该指针?
提前致谢
答案 0 :(得分:5)
C标准库中的realloc函数可能就是您想要的。
在您的情况下,它可能不会执行任何复制操作,因为内存管理器没有理由分配新的内存区域。只有新旧大小之间的差异可能被系统回收为可用内存。
如果您使阵列变大,则会发生复制,因为malloc和朋友不保证“当前”区域之后的内存实际上是空闲的。如果是,那就没关系,当前的内存分配将会扩展。 如果没有,则需要找到更大的可用内存区域,并且可以在内存中的任何位置分配它。
答案 1 :(得分:2)
您是否考虑过使用realloc
?
int main(void)
{
int *array = NULL, *tmp;
if(!(array = malloc(5 * sizeof(int)))) return 1;
if(!(tmp = realloc(array, 2*sizeof(int))))
{
free(array);
return 1;
}
array = tmp;
}
您可以在没有tmp
指针的情况下执行此操作,只需拥有array = realloc(array, 2*sizeof(int))))
,但这可能会在以后出现问题。
答案 2 :(得分:0)
可以设计一个可以实现这一目标的内存管理器,但是没有一个常用的内存管理器具有此属性。您可以编写自己的mm并将其用于这些数组。
答案 3 :(得分:0)
我会使用realloc。 Realloc可能会复制内存,但这仍然比滚动自己的内存管理来解决复制问题更有效。
有些人会告诉你,当结果尺寸较小时,没有表现良好的C库会复制。他们可能是对的。但是,我不使用或编写商业C库,因此就我而言,索赔没有事实根据。