处理数组中 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
的修改后的值传回给调用者),但请注意在那种情况下,您的函数将不适用于普通数组。
当我有一个函数获取指针 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
的修改后的值传回给调用者),但请注意在那种情况下,您的函数将不适用于普通数组。