当调用malloc(size)时,实际分配的内存大小大于size字节,这是因为在分配的内存区域头部有类似于
struct control_block {
unsigned size;
int used;
};
这样的一个结构,如果malloc函数内部得到的内存区域的首地址为void *p
,那么它返回给你的就是p + sizeof(control_block)
,而调用free(q)
的时候,该函数把p减去sizeof(control_block)
,然后就可以根据((control_blcok*)q)->size
得到要释放的内存区域的大小。这也就是为什么free只能用来释放malloc分配的内存,如果用于释放其他的内存,会发生未知的错误。