You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

main与somef循环调用是否会引发激活记录栈内存溢出?

递归循环调用的栈溢出问题分析
  • 无限递归必然触发栈溢出:main()和somef(int)无终止的互相调用属于无限递归,每次函数调用都会在栈上生成包含返回地址、局部变量、寄存器上下文的激活记录(栈帧)。栈的总大小有限(通常为几MB级别),持续压栈最终会耗尽栈空间,触发栈溢出错误。

  • 无提示终止本质是栈溢出崩溃:你测试的程序运行半秒后无错误终止,实际就是栈溢出导致的进程异常退出。不同操作系统和编译环境对栈溢出的处理逻辑不同,部分场景下不会弹出显性错误提示,直接终止进程。可以通过查看进程退出状态确认:比如Linux下执行echo $?,非0值即代表异常终止;Windows可通过调试器或命令行查看退出码。

  • long long变量加速栈溢出进程:测试代码中的long long变量会增大每个栈帧的体积,栈空间消耗速度更快,因此程序会比无大变量的情况更快耗尽栈内存并终止。

  • 原输入场景的崩溃风险:如果main()读取输入后再触发递归调用,若输入是阻塞式的(需等待用户输入),栈帧增长速度会变慢,可能需要更多次输入才会耗尽栈空间;但只要递归没有终止条件,最终必然会触发栈溢出崩溃。若输入是非阻塞的,栈会快速耗尽,很快就会崩溃。

  • 递归优化不适用此场景:部分编译器会对尾递归做优化以避免栈溢出,但main()是特殊函数,多数编译器不会对其递归调用做优化,且你这种互相递归不属于尾递归场景,因此无法依赖优化避免栈溢出。

内容的提问来源于stack exchange,提问作者ConventionalProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:22:50