为什么malloc时需要指定size,对应的free时不需要指定size

当调用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分配的内存,如果用于释放其他的内存,会发生未知的错误。