相互调用函数导致stackoverflow错误

时间:2015-06-11 03:07:45

标签: c++ c visual-studio stack-overflow

我尝试使用visual studio在C ++中使用示例。

void egg();

void chicken () 
{
    return egg ();
}

void egg () 
{
    return chicken ();
}

int _tmain(int argc, _TCHAR* argv[])
{
    chicken();
    return 0;
}

运行时遇到堆栈溢出异常错误。 可以请任何人解释我为什么会出现这样的错误。我假设这将是无限循环。

3 个答案:

答案 0 :(得分:1)

每次chicken ()来电egg()egg()来电chicken ()时,他们的return地址都会被推送到the stack。由于堆栈是有限内存,因此您会收到“像 stackoverflow异常”这样的错误。

阅读this以获得更多理解。

答案 1 :(得分:1)

你所拥有的是无限循环。

这可以写成

void chicken () 
{
    return chicken();
}

您正在递归调用函数chicken(),函数中没有退出条件。所有递归函数都应该有退出条件,否则你的堆栈内存不足,最终你会遇到stackoverflow

答案 2 :(得分:0)

这样想,你拨打<span class="likebtn-wrapper" data-identifier="likeButton1" datatheme="ugreen"></span><script>(function(d,e,s){if(d.getElementById("likebtn_wjs"))return;a=d.createElement(e);m=d.getElementsByTagName(e)[0];a.async=1;a.id="likebtn_wjs";a.src=s;m.parentNode.insertBefore(a, m)})(document,"script","//w.likebtn.com/js/w/widget.js");</script> ,然后拨打chicken(),拨打egg(),然后拨打chicken(),依此类推。它会导致一个非有限的循环。在一定量的迭代之后,这会导致溢出,因为函数调用使用堆栈中的资源,这不是无限的,并且函数调用将保留在堆栈上,直到程序结束或满足其他终止条件。