You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针移动后free()释放字节数及malloc与free相关技术问题咨询

指针偏移后调用free()的内存释放问题

先看你给出的代码片段:

char* p = malloc(10); 
p = p + 1; 
free(p);

针对这段代码,咱们逐个解答你的三个疑问:

疑问1:调用malloc(10)时,malloc如何返回内存地址?

当你调用malloc(10)时,malloc会先在堆内存的空闲块链表中寻找一块足够容纳你请求的10字节的内存块。如果找到合适的块,它会把这块内存标记为已使用,然后返回这块内存可用区域的起始地址——也就是你最终存在p里的那个地址。如果空闲链表中没有足够大的块,malloc会向操作系统申请更多的堆内存,把新申请的内存加入空闲链表后再进行分配。

这里要注意:malloc实际分配的内存通常会比你请求的10字节多一点,多出来的部分用来存储内存块的管理信息(比如块的大小、下一个空闲块的指针等),这部分是隐藏的,你拿到的指针不会指向这部分区域。

疑问2:执行free(p)时会释放多少字节的内存?

这是未定义行为,没有确定的答案!

free函数的要求是:必须传入由malloc、calloc或realloc返回的原始指针。你这里把p偏移了1,传入的是一个非原始指针,这违反了free的使用规则。这种情况下,程序可能出现各种问题:比如直接崩溃、误释放其他内存块导致数据损坏、内存泄漏(原来的10字节内存根本没被释放),甚至在某些环境下看似“正常”但埋下隐患。所以绝对不要这么做。

疑问3:free()是如何知晓需要释放的字节数的?

秘密就在malloc分配的那部分隐藏管理信息里。当malloc给你返回指针时,这个指针指向的是内存块的可用区域,而在这个区域的前面(地址更低的位置),malloc已经存储了这个内存块的总大小(包括管理信息和你请求的用户数据大小)。

当你调用free(原始指针)时,free会把指针往回偏移到管理信息的起始位置,读取里面记录的块大小,然后根据这个大小把整个内存块标记为空闲,放回空闲链表,或者在合适的时候还给操作系统。

内容的提问来源于stack exchange,提问作者Sameera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:06:23