栈帧、递归与栈溢出
更新时间:2026-10-01。配合 01-memory-management,本文专治“跑得好好的突然崩/踩内存”。
一、栈怎么长
每次函数调用压入栈帧(返回地址、帧指针、局部对象),返回时回收。栈从高地址向低增长且有固定上限:主线程常见 8MB,自建线程、裸机/RTOS 任务栈可能仅几 KB。
二、溢出场景
深/无限递归、栈上放大数组或大 struct、每层帧过大,触底后覆盖相邻内存或直接异常(嵌入式 HardFault)。

三、常见坑
- 在递归函数里开大局部缓冲。
- 用地址传递栈变量给异步使用。
- 只在 PC 上测,忽视嵌入式小栈。
小结
总结
每次函数调用都在固定上限、向低地址增长的调用栈上压入一帧(返回地址、帧指针、局部变量),主线程常见 8MB、自建线程/裸机 RTOS 任务栈可能仅几 KB;深(或无限)递归、栈上大数组/大 struct、每层帧过大都会触底溢出,进而覆盖相邻内存或在嵌入式上触发 HardFault;防范要先估算"帧大小 × 最大深度",把递归改迭代/尾调用、大对象挪到堆或池或调大栈,并用栈水位/金丝雀和 GDB 验证——且不能只在 PC 上测而忽视嵌入式小栈。