刚开始学习C,遇到以下问题:
我需要在 C 中缩小一个整数数组,最后删除元素。通过删除我的意思是释放。常见的答案是为较小的数组分配新内存,然后将原始数组的所有项( -items to remove )复制到新分配的内存中,然后 free() 原始数组。
因为我必须处理非常大的数组,所以我宁愿跳过复制部分。
是否可以创建一个指针变量,指向“接近原始数组的末尾”,大小为“数组末尾 - 接近末尾”,然后释放该指针?
提前致谢
C 标准库中的realloc函数可能是您想要的。
在您的情况下,它可能不会执行任何复制操作,因为内存管理器没有理由分配新的内存区域。只有新旧大小之间的差异可能会被系统回收为可用内存。
如果您使数组更大,则会发生复制,因为 malloc 和朋友不保证“当前”区域之后的内存实际上是空闲的。如果是,那么没关系,当前内存分配会被扩大。如果没有,则需要找到更大的可用内存区域,并且可以将其分配到内存中的几乎任何位置。
你有没有想过使用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))))
,但这可能会导致以后出现问题。
可以设计一个内存管理器来实现这一点,但没有一个常用的内存管理器具有此属性。您可以编写自己的 mm 并将其用于这些数组。
我会使用realloc。Realloc 可能会复制内存,但这仍然比滚动您自己的内存管理来解决复制问题更有效。
有些人会告诉您,当结果大小较小时,不会复制任何表现良好的 C 库。他们可能是对的。但是,我不使用或编写商业 C 库,所以就我而言,这种说法是未经证实的。