【问题标题】:Easy way to deal with free in an array [closed]在数组中处理免费的简单方法[关闭]
【发布时间】:2016-03-03 21:08:21
【问题描述】:

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

【问题讨论】:

  • vector[n] 是一个int...你不能这样free()
  • 您可以创建一个结构数组来制作一个假的int数组或链表。
  • free() 没有按照您的想法行事或工作
  • 您不能使用free 来执行此操作。 free 用于释放您使用mallocmalloc 的变体之一分配的动态内存。如果您想要一个可以轻松删除或添加且不会留下漏洞的有序项目列表,那么合适的结构可能是链表,而不是数组。

标签: c pointers realloc


【解决方案1】:

给定一个这种形式的函数:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2012-12-26
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多