【发布时间】:2017-03-14 22:28:54
【问题描述】:
假设我有一个函数,它所做的只是调用自身而没有任何终止。
myFunction(){
myFunction()
}
如果我运行一个包含这个函数的程序,我最终会得到一个分段错误。为什么会这样?堆栈空间不足?
另外,StackGuard 能否防止此故障?为什么或为什么不?
【问题讨论】:
-
如果您尝试运行该代码,应该会因为语法错误而导致它甚至无法构建。
-
这个递归没有停止条件。你会期待什么?
-
堆栈是有限的资源。在 Windows 上,进程的默认堆栈大小是单个 MB。防止它的唯一方法是有一个实际终止递归的终止条件。
-
@EugeneSh。好吧,我对无限递归的期望是堆栈溢出。
-
@Timmy 是的,但是函数调用不会覆盖金丝雀,它只是在堆栈上创建一个新的框架,其中包含一组新的金丝雀。事实上,使用堆栈金丝雀会使堆栈溢出更快,因为堆栈帧的空间更少。
标签: c recursion segmentation-fault stack-overflow