收缩数组C

时间:2012-08-29 19:03:11

标签: c arrays trim shrink

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

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

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

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

提前致谢

4 个答案:

答案 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库,因此就我而言,索赔没有事实根据。