【问题标题】:Calling functions from each other causing stackoverflow error [duplicate]相互调用函数导致stackoverflow错误[重复]
【发布时间】:2015-06-11 03:07:45
【问题描述】:

我在 Visual Studio 中尝试了以下 C++ 示例。

void egg();

void chicken () 
{
    return egg ();
}

void egg () 
{
    return chicken ();
}

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

运行时出现类似 stackoverflow 异常的错误。 任何人都可以解释一下为什么会出现这样的错误。我假设这将进入无限循环。

【问题讨论】:

  • 试试/Ox。 BTW return chicken (); return void 无效。
  • @BLUEPIXY:但这段代码编译正确。顺便提一下/0x,这个怎么用……?
  • O 不是0/Ox 是优化选项。如果 C 则无效。

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


【解决方案1】:

每次您的chicken () 调用egg()egg() 调用chicken (),他们的return 地址被推送到the stack。由于堆栈是有限内存,因此您会收到“stackoverflow exception 之类的错误”。

阅读this了解更多。

【讨论】:

    【解决方案2】:

    你这里有无限循环。

    这可以写成

    void chicken () 
    {
        return chicken();
    }
    

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

    【讨论】:

      【解决方案3】:

      这样想,你调用chicken(),然后你调用egg(),它调用chicken(),然后是egg(),以此类推。它会导致非无限循环。这会在一定数量的迭代后导致溢出,因为函数调用使用堆栈中的资源,这不是无限的,并且函数调用将保留在堆栈上,直到程序结束或满足其他终止条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 2015-09-12
        • 2018-09-12
        • 1970-01-01
        相关资源
        最近更新 更多