在C中删除动态分配的数组成员

时间:2011-04-06 14:16:51

标签: c arrays memory-management

假设我有一个结构数组,我想删除一个条目结构,条目符合某些条件。

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

如何删除条目?

我在考虑

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

但是这会为数组留下相同数量的内存,而实际上我需要更少的内存和一个孤立(某种)最后一个条目。

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

3 个答案:

答案 0 :(得分:4)

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) > (allocated_count)时)。


如果结构很大,也可以考虑不同的数据结构(也许是链表)。

答案 1 :(得分:1)

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

但是,您可能不得不重新考虑正在使用的数据结构。它看起来像一个链表可以更容易管理内存并使删除操作更快,因为它不需要转换元素。

答案 2 :(得分:0)

在这里使用realloc是合适的。它不会做memcpy - 只有当realloc大小更大并且没有扩展空间时才需要。