0
收藏
微博
微信
复制链接

malloc后跑着跑着堆栈溢出?别只怪栈太小

2026-06-27 09:44
69

嵌入式开发里不少人习惯用malloc动态申请内存,可明明栈大小设得足够,程序跑一段时间后还是突然堆栈溢出崩溃。问题往往不在栈本身,而是堆和栈的联动逻辑出了问题。

63.png

1. 堆和栈双向对撞

STM32这类单片机的内存布局里,堆从低地址往高地址长,栈从高地址往低地址长。你反复调用malloc申请内存不释放,堆空间慢慢往高地址扩张,最后直接撞上向下生长的栈。栈指针被堆数据冲乱,立刻触发溢出。

2. 内存碎片挤爆连续空间

频繁malloc和free后,堆里会出现大量零散的空闲碎片。总剩余内存明明够,但你申请大块连续内存时找不到合适空间,malloc返回NULL。很多人没做返回值判断,直接对空指针操作,意外改写栈上的返回地址,间接引发栈溢出。

3. 中断里偷偷调用malloc

中断服务程序的执行优先级很高,在里面调用malloc时,会打断正在进行的内存分配流程。堆管理的链表指针被中途修改,下次分配时直接越界,往栈的方向写入非法数据,悄无声息破坏栈结构。

4. 局部数组没移去栈

很多人以为用了malloc就不会占栈,却忘了函数里还定义了大尺寸局部数组。堆已经占了大半内存,再加上栈上的大数组,双重挤压下栈空间瞬间被耗尽。

5. 忘记匹配free的连锁破坏

申请的内存一直不释放,堆的可用区域持续收缩。后续函数调用时,栈需要向下拓展空间,却被不断膨胀的堆堵死,最终触发栈指针越界。


本文凡亿教育原创文章,转载请注明来源!

登录后查看更多
0
评论 0
收藏
侵权举报
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

热门评论0

相关文章

小白电子

一个从小白过来的电子工程师,并且想让更多的电子小白变成对国家有用的电子设计工程师

开班信息