11

刚开始学习C,遇到以下问题:

我需要在 C 中缩小一个整数数组,最后删除元素。通过删除我的意思是释放。常见的答案是为较小的数组分配新内存,然后将原始数组的所有项( -items to remove )复制到新分配的内存中,然后 free() 原始数组。

因为我必须处理非常大的数组,所以我宁愿跳过复制部分。

是否可以创建一个指针变量,指向“接近原始数组的末尾”,大小为“数组末尾 - 接近末尾”,然后释放该指针?

提前致谢

4

4 回答 4

5

C 标准库中的realloc函数可能是您想要的。

在您的情况下,它可能不会执行任何复制操作,因为内存管理器没有理由分配新的内存区域。只有新旧大小之间的差异可能会被系统回收为可用内存。

如果您使数组更大,则会发生复制,因为 malloc 和朋友不保证“当前”区域之后的内存实际上是空闲的。如果是,那么没关系,当前内存分配会被扩大。如果没有,则需要找到更大的可用内存区域,并且可以将其分配到内存中的几乎任何位置。

于 2012-08-29T19:06:23.087 回答
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)))),但这可能会导致以后出现问题。

于 2012-08-29T19:11:16.723 回答
0

可以设计一个内存管理器来实现这一点,但没有一个常用的内存管理器具有此属性。您可以编写自己的 mm 并将其用于这些数组。

于 2012-08-29T19:06:23.343 回答
0

我会使用realloc。Realloc 可能会复制内存,但这仍然比滚动您自己的内存管理来解决复制问题更有效。

有些人会告诉您,当结果大小较小时,不会复制任何表现良好的 C 库。他们可能是对的。但是,我不使用或编写商业 C 库,所以就我而言,这种说法是未经证实的。

于 2012-08-29T19:06:37.673 回答