C语言 递归分段故障和StackGuard



假设我有一个函数,它所做的就是调用自己,没有任何终止。

myFunction(){
    myFunction()
}

如果我运行一个包含这个函数的程序,我最终会得到一个分段错误。为什么会发生这种情况?堆栈空间不足?

另外,StackGuard可以防止这个错误吗?为什么或者为什么不呢?

由于递归是无限的,并且对于每次调用,返回地址和基指针(帧指针)至少被压入堆栈,您最终将耗尽堆栈空间,或者更一般地说,耗尽内存,因为内存是有限的资源。

没有什么可以防止这种情况,因为是程序员"设计"了这种无限递归。你希望"防止这种错误"是什么?正如我所说,这不是一个错误,因为这是程序的设计。您刚刚耗尽了有限的资源,导致操作系统中止程序。

人力资源>

<编辑:以下是拦截seg故障的示例(未经测试,基于VC2008文档):>

jmp_buf home;
void myFunction(void)
{
    myFunction();
}
void SegvHandler(int signal)
{
    longjmp(home);
}
int main(void)
{
    signal(SIGSEGV, SegvHandler);
    if (setjmp(home)) {
        printf("Oops...n)
        return 1;
    }
    myFunction();
    return 0;
}
人力资源>

<测试:在VC2008中测试后,似乎无法捕获此错误。原因似乎是:首先发生了堆栈溢出,现在没有更多的堆栈空间来调用另一个函数,即信号处理程序。>

每次调用函数时,都会在内存中为该函数调用创建一个新的堆栈帧。该堆栈在函数返回时消失。由于你的函数不返回并不断调用新的调用,它将不断创建堆栈帧,这意味着最终你耗尽内存来保持这些堆栈帧。

最新更新