在C中,对结束前包含NULL的内存块调用free()是否安全



如果我使用malloc()为自己分配一块内存,将NULL分配给位于该块内但不位于该块末尾的内存地址,然后在该块上调用free(),我会成功释放整个块,还是只释放块中达到NULL的部分?换句话说,free()是否依赖于NULL终止来标识内存块的末尾,或者是否有其他内部方法?

我知道这个问题只适用于为指针分配的内存(当NULL实际上意味着除所有位为零之外的其他东西时)

例如:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    char **myBlock = malloc(20 * sizeof(char *));
    myBlock[10] = NULL;
    free(myBlock);
    return 0;
}

这个代码会释放10 * sizeof(char *)还是20 * sizeof(char *)

非常感谢!

函数malloc将使用一个结构来管理它分配给的内存

   struct mem_control_block { 
    int is_available;    
    int size;            //the actually size allocated
    };

因此,free函数还将使用mem_control_block中的可变大小来释放内存缓冲区。因此Null不会影响。

free()不知道它的内容,所以答案是肯定的。free()将释放通过malloc() 分配的完整内存块

free只使用从malloc返回的指针。该指针只具有内存块的信息,而不具有与该内存上的内容有关的信息。所以免费与NULL无关。

例如,内存分配基于Glibc上独立于内核的实现,操作系统总是在程序存在后收回内存,对指针调用free()将释放整个块,无论你放入什么。

如果你想得到更详细的解释,你可以看看借来的malloc(),谢谢你。

内存分配保留了已分配内存块的引用和长度(仅此而已),如果您释放(),您将返回:

20 * sizeof(char *) 

干杯

相关内容

  • 没有找到相关文章