相互调用函数导致计算器溢出错误
Calling functions from each other causing stackoverflow error
我用 visual studio 在 C++ 中尝试了以下示例。
void egg();
void chicken ()
{
return egg ();
}
void egg ()
{
return chicken ();
}
int _tmain(int argc, _TCHAR* argv[])
{
chicken();
return 0;
}
虽然 运行 我遇到了类似 Whosebug 异常的错误。
任何人都可以解释一下为什么会出现这样的错误。我假设这将无限循环。
这样想,你调用chicken()
,然后你调用egg()
,它又调用chicken()
,然后是egg()
,依此类推。它会导致非有限循环。这会导致一定数量的迭代后溢出,因为函数调用使用堆栈中的资源,这不是无限的,并且函数调用将保留在堆栈中,直到程序结束或满足其他终止条件。
每次您的 chicken ()
调用 egg()
和 egg()
调用 chicken ()
时,它们的 return
地址都会被推送到 the stack。由于堆栈是有限内存,因此您得到 "error like Whosebug exception"。
阅读 this 以获得更多理解。
这里是无限循环。
这可以写成
void chicken ()
{
return chicken();
}
您正在递归调用函数 chicken()
,并且函数中没有退出条件。所有递归函数都应该有退出条件,否则你 运行 堆栈内存不足,最终你会命中
我用 visual studio 在 C++ 中尝试了以下示例。
void egg();
void chicken ()
{
return egg ();
}
void egg ()
{
return chicken ();
}
int _tmain(int argc, _TCHAR* argv[])
{
chicken();
return 0;
}
虽然 运行 我遇到了类似 Whosebug 异常的错误。 任何人都可以解释一下为什么会出现这样的错误。我假设这将无限循环。
这样想,你调用chicken()
,然后你调用egg()
,它又调用chicken()
,然后是egg()
,依此类推。它会导致非有限循环。这会导致一定数量的迭代后溢出,因为函数调用使用堆栈中的资源,这不是无限的,并且函数调用将保留在堆栈中,直到程序结束或满足其他终止条件。
每次您的 chicken ()
调用 egg()
和 egg()
调用 chicken ()
时,它们的 return
地址都会被推送到 the stack。由于堆栈是有限内存,因此您得到 "error like Whosebug exception"。
阅读 this 以获得更多理解。
这里是无限循环。
这可以写成
void chicken ()
{
return chicken();
}
您正在递归调用函数 chicken()
,并且函数中没有退出条件。所有递归函数都应该有退出条件,否则你 运行 堆栈内存不足,最终你会命中