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

1. 堆和栈双向对撞
STM32这类单片机的内存布局里,堆从低地址往高地址长,栈从高地址往低地址长。你反复调用malloc申请内存不释放,堆空间慢慢往高地址扩张,最后直接撞上向下生长的栈。栈指针被堆数据冲乱,立刻触发溢出。
2. 内存碎片挤爆连续空间
频繁malloc和free后,堆里会出现大量零散的空闲碎片。总剩余内存明明够,但你申请大块连续内存时找不到合适空间,malloc返回NULL。很多人没做返回值判断,直接对空指针操作,意外改写栈上的返回地址,间接引发栈溢出。
3. 中断里偷偷调用malloc
中断服务程序的执行优先级很高,在里面调用malloc时,会打断正在进行的内存分配流程。堆管理的链表指针被中途修改,下次分配时直接越界,往栈的方向写入非法数据,悄无声息破坏栈结构。
4. 局部数组没移去栈
很多人以为用了malloc就不会占栈,却忘了函数里还定义了大尺寸局部数组。堆已经占了大半内存,再加上栈上的大数组,双重挤压下栈空间瞬间被耗尽。
5. 忘记匹配free的连锁破坏
申请的内存一直不释放,堆的可用区域持续收缩。后续函数调用时,栈需要向下拓展空间,却被不断膨胀的堆堵死,最终触发栈指针越界。
本文凡亿教育原创文章,转载请注明来源!

扫码关注








































