首页 > 解决方案 > 如何在c中释放一部分连续分配的内存?

问题描述

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

标签: cpointersdynamic-memory-allocationfree

解决方案


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

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

  • 用于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--;
    }

推荐阅读