gpt4 book ai didi

c - 递归段错误和 StackGuard

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:05 25 4
gpt4 key购买 nike

假设我有一个函数,它所做的只是在没有任何终止的情况下调用自身。

myFunction(){
myFunction()
}

如果我运行一个包含这个函数的程序,我最终会得到一个段错误。为什么会这样?堆栈空间用完了吗?

此外,StackGuard 可以防止这种故障吗?为什么或为什么不?

最佳答案

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

没有什么可以防备这一点,因为正是程序员“设计”了这种无限递归。您期望“防止出现此错误”是什么?正如我所说,这不是错误,因为它是程序的设计。您只是用完了有限的资源,导致操作系统中止程序。


编辑:以下是拦截段错误的示例(未经测试,基于 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;
}


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

关于c - 递归段错误和 StackGuard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com