【问题标题】:Stack Overflow in resursive calls递归调用中的堆栈溢出
【发布时间】:2015-08-30 05:34:34
【问题描述】:

我刚刚通过this Wikipedia entry。出于好奇找到分配给一个简单进程的堆栈大小,我尝试了这个

int main()
{
    static int count = 0;
    cout<<"  Count = "<<count++<<endl;
    main();
    return 0;
}

编译器 DevC++ 我得到了这个:-

到目前为止,一切都很好,可以理解,顺便说一下,从最后一位数字,即 43385,我可以猜测最大堆栈大小 - 在 32 位机器上(如果我说 4 个字节(每次调用的堆栈返回地址为 4 个字节) ),我可能听起来很傻。

现在,如果我将程序修改为:-

void foo()
{
    static int count = 0;
    cout<<"  Count = "<<count++<<endl;
    foo();
}

int main()
{
    foo();
    return 0;
}

在此我得到堆栈溢出计数:- 130156(好的,很好)

但我的问题是,如果我在 main 和 foo 之间添加一个函数,我得到这个计数递减 1(130155),如果 b/w foo 和 main 计数中的 2 个函数递减 2(130154)等等.为什么会出现这种行为?是不是因为每个函数地址都消耗了1个空间。

【问题讨论】:

  • 永远不要打电话给main()
  • 我只是在做实验?顺便说一句,有什么具体原因吗?
  • 这是未定义的行为,被标准禁止。
  • 贴出的代码与运行的代码不匹配。

标签: c++ operating-system stack-overflow


【解决方案1】:

首先通过添加 Count++ 来更正您的程序(愚蠢)。 堆栈大小不是固定的,大多数编译器都允许您指定堆栈大小。堆栈大小还取决于一些因素,如平台、工具链、ulimit 和其他参数。有许多静态和动态属性可以影响它。 内存限制分为三种: 对于 32 位(Windows) 静态数据 - 2GB 动态数据 - 2GB 堆栈数据 - 1GB(堆栈大小由链接器设置,默认为 1MB。可以使用链接器属性 System > Stack Reserve Size 增加)。

通过使用您的程序,您可以猜测当前堆栈大小。 memory-limits-applications-windows Stack Overflow Recursion in C c-maximum-stack-size-of-program 会帮助你。

【讨论】:

  • 哦,可能不好,已更正,我只是复制粘贴了代码,只是这样写的,所以错过了。无论如何感谢您的回复和有用的链接。
猜你喜欢
  • 2020-12-17
  • 2015-04-04
  • 2017-01-20
  • 2018-12-02
  • 2017-09-06
  • 2019-07-08
  • 2015-08-05
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多