假设我有一个结构数组,我想删除一个条目结构,条目符合某些条件。
这个数组是用malloc动态分配的,我将元素计数保存在一个单独的变量中。
如何删除条目?
我在考虑
for (i = pos; i < arr_len; i++) {
arr[i] = arr[i+1];
}
arr_len--;
但是这会为数组留下相同数量的内存,而实际上我需要更少的内存和一个孤立(某种)最后一个条目。
在这种情况下发出realloc是一种公认的做法吗? realloc会在这种情况下做memcpy吗? (将分配的内存缩短一个块)。
答案 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大小更大并且没有扩展空间时才需要。