1

如果我使用 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 *)

提前谢谢了!

4

4 回答 4

3

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

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

因此,free 函数也会使用 mem_control_block 中的变量 size 来释放内存缓冲区。因此 Null 不会影响。

于 2013-07-09T09:34:54.720 回答
2

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

于 2013-07-09T09:31:44.850 回答
0

free 只使用从 malloc 返回的那个指针。这个指针只有内存块的信息,而不是这个内存上的内容。所以 free 与 NULL 无关。

于 2013-07-09T09:33:50.997 回答
0

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

如果您想要更详细的解释,您可以查看借用的malloc()感谢 tomelm。

内存分配保留分配的内存块的引用和长度(仅此而已),如果你 free() 它你会回来:

20 * sizeof(char *) 

干杯

于 2013-07-09T09:53:04.763 回答