马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
问题现象
栈溢出(Stack Overflow)是 C/C++ 程序中常见的一类运行时错误:当函数调用层级过深,或者每次调用都在栈上分配过大的局部变量,导致栈空间被耗尽时,程序会崩溃并生成 core dump 文件。下面用一个缺少终止条件的递归函数来复现该问题。
下面的递归函数没有正确的退出条件,每次调用都会在栈上分配 1KB 的局部数组,无限递归最终触发栈溢出:
#include <stdio.h>
void recursive_function(int n) {
char large_array[1024]; /* 每次递归调用都会在栈上分配这么多空间 */
printf("Level %d, address of array: %p\n", n, &large_array);
recursive_function(n + 1);
}
int main() {
recursive_function(1);
return 0;
}
用 GDB 分析 core dump
编译并运行上面的程序会崩溃并生成 core 文件。使用 GDB 加载可执行文件与 core 文件即可查看调用栈:
gdb ./a.out core
进入 GDB 后,用 bt(backtrace)查看栈回溯,会看到 recursive_function 被反复调用了上万层,这正是栈溢出的直接证据。也可以用 list 命令定位到源码对应的行号。
如何避免
- 确保递归函数存在明确的终止条件(基线条件)。
- 避免在栈上分配过大的局部数组,可改用动态内存(
malloc)或全局/静态存储。
- 如确有深度递归需求,可改用迭代实现,或增大线程栈大小。
- 编译时开启栈保护选项(如
-fstack-protector)有助于尽早发现问题。
qidao123.com企服评测-应用市场 编辑提示
|