处理数组中 free 的简单方法

Easy way to deal with free in an array

当我有一个函数获取指针 int *vector 和几个 int 值时。我想删除元素编号 n。所以我将在该元素上使用 free()。我现在遇到的问题是我的 int 值数组中有一个 "hole"。有没有一种简单的方法可以解决这个问题,或者我真的必须制作一个新的 int pinter 并重新排序我的矢量?

无法释放 malloc() 返回的块的一部分。如果要删除record[n],需要将record[n+1]...record[last]复制到数组中

如果你真的需要free()每个元素,你必须先malloc()每个元素。

给出这种形式的函数:

void delete_element(int *vector, size_t index) {
    // ...
}

对应于 vector 的实际参数应该是指向一系列一个或多个(暗示:index + 1 或更多)连续 int 的指针。这可以是普通 int 数组的一部分或全部,也可以是动态分配的块。如果是前者,那么您根本无法释放 space 的任何部分。如果是后者,那么您可以释放或重新分配 整个 space,而不仅仅是与一个元素关联的部分。

为避免删除在数组中留下空洞,您需要将后面的元素向下移动,为此,您需要知道总共有多少个元素。因此,您需要一个信息量更大的函数签名,也许是这样的:

void delete_element(int *vector, size_t *size, size_t index) {
    // ...
}

实际的删除可能涉及简单地使用memmove()移动后面的元素(覆盖要删除的元素),然后递减大小。关于后者,请注意,我建议传递一个指向向量大小的指针,以便函数可以修改调用者的副本。

如果你还想缩小分配,那么你需要做更多的工作(涉及调用 realloc(),并将 vector 的修改后的值传回给调用者),但请注意在那种情况下,您的函数将不适用于普通数组。