free在释放内存的时候,为什么不需要指定内存的大小?

free在释放内存的时候,为什么不需要指定内存的大小?
这个是学生前两天面大疆的时候,面试官提出的问题。
这个问题不难,比起malloc申请内存的过程要简单的多。
malloc在申请内存的时候,需要指定内存的大小,申请成功则返回这块内存的地址,但是free的时候,只需要指定释放的内存的起始地址,系统就知道从这个地址开始需要释放多少个字节。
char *ptr = (char *)malloc(128);free(ptr);原因也很简单,malloc在申请内存的时候,申请到的内存往往比我们需要的内存大,也就是在我们能使用的内存前面会多出一块内存存放头部信息,这个信息就包含了接下来这块内存的大小。
所以在释放内存的时候,只要根据我们提供的地址,向前再移动一些字节,就能知道需要释放的内存大小。
《unix环境高级编程》一书中也提到:  
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。
当然,这个所谓的头部信息,不同的平台存放的内容也不太一样。
《c程序设计语言》这本书中就提到了一种结构:
union header_t{ struct { unsigned size;     union header_t *next;  }; long align;};联合体中嵌套了结构体,结构体中包含了两个成员:一个是指向下一个头部的指针,一个表示堆内存的大小。
写个代码验证一下。char *ptr = (char *)malloc(128);memset(ptr - 16, 0, 16);free(ptr);先用malloc申请一块内存,然后从返回的地址开始,向前16个字节,全部清空成0,然后再用free释放内存。
编译没有问题,但是运行的时候,提示free出错。 这只是个演示代码,实际情况不一定是16个字节。
所以在写代码的时候,一定不要越界访问,一旦出了问题,很难去定位问题的出处。


全球液晶电视面板平均尺寸首破50英寸
变压器渗漏油原因及处理方法
浅析领先的SiC/GaN功率转换器的驱动
继共享宝马之后,共享飞机又来了,无人驾驶!随叫随到到 富豪私人机成“滴滴专机”价格感人
用iPhone13蓝牙耳机怎么选?搭配苹果13的十大蓝牙耳机
free在释放内存的时候,为什么不需要指定内存的大小?
京东自主研发大型物流无人机,可能要成为第一个“吃螃蟹”者
小米6什么时候上市:米6最新消息表明,不看这个你敢备战开抢?
光耦的CTR值概念及计算方法
芯片的制作流程及原理
工业控制系统迈向开放 你想好如何进行安全防范了吗
未来十年信贷收缩、技术提升和人口老龄化,将对制造业造成冲击
全球思想领导力,引领数据革命
联发科许下处分承诺,汇顶科技免入竞争局面
尿素溶液的使用以及SCR后处理系统的常规保养
农业物联网气象站:引领农田新风尚
学习FPGA的小建议与总结分享
郭明錤爆料称iPhone 15可能搭载Tyep C接口
第二届高比能固态电池关键材料技术研讨会与你相约长沙
汽车NFC钥匙新宠—NCF3321介绍