【问题标题】:Deleting dynamically allocated array members in C在 C 中删除动态分配的数组成员
【发布时间】:2011-04-06 14:16:51
【问题描述】:

假设我有一个结构数组,我想删除一个结构的条目,该结构的条目与某些条件匹配。

这个数组是用malloc动态分配的,我把元素计数保存在一个单独的变量中。

如何删除条目?

我在考虑

for (i = pos; i < arr_len; i++) {
  arr[i] = arr[i+1];
}
arr_len--;

但这为数组留下了相同数量的内存,而我实际上需要的内存更少,最后一个条目是孤儿(有点)。

在这种情况下发出 realloc 是一种公认​​的做法吗?在这种情况下 realloc 会做 memcpy 吗? (将分配的内存缩短一个块)。

【问题讨论】:

    标签: c arrays memory-management


    【解决方案1】:

    realloc 没问题...但请继续阅读:)

    realloc 不会移动部分内存;它可能会移动整个街区。因此,您需要在更改分配的大小之前复制数据。

    要移动数据,memmove(不是memcpy)是一个不错的选择:它适用于属于同一对象的内存区域。不过,请注意不要超出数组限制;就像您在代码中所做的那样。

    for (i = pos; i < arr_len; i++) {
      arr[i] = arr[i+1];
    }
    

    arr[i] = arr[i + 1]; 将尝试访问超过允许大小的值。你需要

    for (i = pos + 1; i < arr_len; i++) {
      arr[i - 1] = arr[i];
    }
    

    调用realloc 时会有一些开销。如果您的结构不大和/或它们只存在很短的时间,请考虑同时保留元素计数和分配的计数,并且只重新分配以扩大((element_count + 1) &gt; (allocated_count) 时)。


    如果结构很大,还要考虑不同的数据结构(可能是链表)。

    【讨论】:

    • 感谢最后一个元素访问。我已经在纸上写了这个特定的案例,但是当短暂地忘记数组是从 0 开始索引时仍然设法错过它!
    【解决方案2】:

    调用 realloc 来缩小分配的内存不一定是个坏主意。

    但是,您可能需要重新考虑正在使用的数据结构。看起来链表可以更轻松地管理内存,并使删除操作更快,因为它不需要移动元素。

    【讨论】:

      【解决方案3】:

      在这里使用 realloc 是合适的。它不会执行 memcpy —— 只有当 realloc 大小较大且没有扩展空间时才需要这样做。

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 1970-01-01
        • 2018-05-01
        • 2015-06-10
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        相关资源
        最近更新 更多