关于malloc返回值的问题? malloc在分配内存时实际上是调用了brk系统调用,我想问下为什么malloc返回的值要比brk多16个字节(64位环境下),有大神知道吗?
如图,因为需要存放malloc出的内存的长度,这就是为什么malloc需要传递长度参数,而对应的free函数却不需要传递长度参数的原因,因为内部以及保存长度啦,当free传递指针参数时,free会先去当前指针指向地址的前16字节长度后再释放内存。这里有个问题,64位机器存储长度只需要8个字节,这里却多了16个字节,另外8个字节起到什么作用呢?这里其实通过查看malloc源码的注释就可以看到: 前8个字节表示之前的空间有多少没有被分配的字节大小,后8个字节表示当前malloc已经分配的字节大小。 关于malloc的具体介绍可以看我这篇文章,额,发现文章被弄飞了,看我回答最后的资料吧! 这里有很详细的介绍。 加更一波: malloc涉及到的系统调用有什么?多次调用malloc有什么现象? 代码如下: 可以发现并不是每次调用malloc都会触发brk系统调用,首次调用malloc,内部会通过brk系统调用更改程序中断地址,分配出一大块内存空间,后续再调用malloc,malloc内部会优先使用之前分配出来的内存空间,直到内部内存空间已经不够再次分配给外部时才会再次触发brk系统调用. 回到最开头,额外分配的那16个字节是什么? 上面分析可以看见程序第一次调用malloc返回的地址并不是heap段的首地址,而是相差了0x10个字节,那这16个字节究竟是什么,可以通过程序打印出这前16个字节的内容. 可以看出规律:这16个字节相当于malloc出来的地址的头,包含一些信息,目前可以看出它包括已经分配的地址空间的大小,第一次malloc申请了0x400(1024)字节,可以发现11 04 00 00 00 00 00 00大于0x400(1024),这8个字节表示数字 0x 00 00 00 00 00 00 04 11 = 0x400(1024) + 0x10(头的大小16) + 1(后面会说明它的含义),可以发现每次调用malloc,这前8个字节代表的含义都是malloc字节数+16+1. 可以猜测,malloc内部会把这前16个字节强转成某种数据结构,数据结构包含某些信息,最主要的是已经分配的字节数,尽管我们不了解具体结构,但是也可以通过代码操作这16个字节验证我们上面总结的规律是否正确,注意代码中不调用free释放内存. 结果可以看出,malloc返回的地址往前的16个字节可以表示已经分配的内存大小,可以验证最开头图中的结论。 从去年年初开始写文章以来,受到很多朋友,我把之前写过的所有C++文章学习资料全部系统地整理成PDF电子书,可以说干货满满,下方卡片:程序喵大人:整理了一年的Linux C++武林秘籍,你早晚用得到(C++进阶必看) 看完两件事: 如果觉得这篇文章对你挺有帮助,请帮我两个忙: 1. 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓-_-)。 2. @程序喵大人,让我们多多交流。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/41668.html