如何在GCC中维护递归调用堆栈?

如何在GCC中维护递归调用堆栈?,c,gcc,compiler-construction,C,Gcc,Compiler Construction,GCC如何确保堆栈不会溢出? 它是否应该检查大小是否小于它可以保留的最大值,并相应地提示用户(尤其是当它被隐式定义时)?这不是一个很好的编程范例吗?它不是。如果递归足够深,则将溢出,编译器对此无能为力 编辑:我应该指出,在我回答这个问题时,问题的内容是: “GCC如何确保堆栈不会溢出?” Linux使用“保护区”。它在每个线程的堆栈末尾放置一个或多个访问保护页 如果程序访问保护区,操作系统将处理故障。如果线程已经在使用其最大允许堆栈,那么它会终止某些东西(线程或整个进程,我不记得是哪个)。否则

GCC如何确保堆栈不会溢出?
它是否应该检查大小是否小于它可以保留的最大值,并相应地提示用户(尤其是当它被隐式定义时)?这不是一个很好的编程范例吗?

它不是。如果递归足够深,则将溢出,编译器对此无能为力


编辑:我应该指出,在我回答这个问题时,问题的内容是:

“GCC如何确保堆栈不会溢出?”

Linux使用“保护区”。它在每个线程的堆栈末尾放置一个或多个访问保护页

如果程序访问保护区,操作系统将处理故障。如果线程已经在使用其最大允许堆栈,那么它会终止某些东西(线程或整个进程,我不记得是哪个)。否则,它会尝试将内存映射到保护区占用的地址以用作堆栈,并保护新扩展堆栈末尾以外的新区域

提示用户并不真正适合Linux这样的操作系统,因为Linux中的许多进程都不受用户监控,因此在出现问题时可能没有任何登录用户。所以你的过程失败了。由于它是一个通用编译器,gcc也不会尝试运行时用户交互


其他操作系统和平台可能有也可能没有堆栈保护页(Windows有)。gcc真正需要做的就是确保如果超出堆栈,它不会因为向前跳了很长一段路而“错过”保护页。

不会,而且也不会是一个很好的编程范例。你会问用户什么?不管他说什么,除了中止计算,你还能做什么?这不是一个真正的问题。