【问题标题】:How to free a part of contiguous allocated memory in c?如何在c中释放一部分连续分配的内存?
【发布时间】:2020-06-12 08:17:43
【问题描述】:

我是 C 新手。我有一个程序,它使用存储指针的calloc() 分配一些内存。这些指针指向我存储人员数据的内存位置。每个人一个指针。所以当我需要删除数据时,我free()指向这些数据的指针。但是带有指针的内存仍然有那个。我也想解放那个地方。据我所知,例如,我不能说free(ptr+5)。我该怎么做?

【问题讨论】:

  • 免费(ptr[5]); ptr[5] = NULL;
  • 你能举一个你的代码的小例子吗?我不确定你记忆中的组织是什么。
  • 只用文字描述代码通常不清楚并且容易被误解。请以minimal verifiable example 的形式提供实际代码,说明您所询问的情况。

标签: c pointers dynamic-memory-allocation free


【解决方案1】:

您不能释放已分配块的开头或中间,而只保留已分配块的结尾;所以(用于删除数组中的条目):

  • 将要删除的条目之后的所有内容移动到已分配块的末尾,移向已分配块的开头;这样要移除的部分就在末尾了

  • 使用realloc() 减小分配块的大小(以在最后释放块)。

狡猾的例子(假设i是你想要释放的条目):

    memmove(&myArray[i], &myArray[i+1], (total_entries - 1 - i) * sizeof(myArray[0]) );
    temp = realloc(myArray, total_entries - 1 * sizeof(myArray[0]));
    if(temp == NULL) {
        /* Ooops. Need to handle the error somehow */
    } else {
        myArray = temp;
        total_entries--;
    }

【讨论】:

  • 是的,基本上就是这样。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2013-02-28
相关资源
最近更新 更多