重复呼叫中的堆栈溢出

时间:2015-08-30 05:34:34

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

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

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

编译器DevC ++ 我明白了: - enter image description here

直到这一点,一切都很好,可以理解,从最后一位数字的方式,即43385我可以猜到最大堆栈大小 - 在32位机器上(如果我说4个字节(每个调用堆栈上的返回地址4个字节) ),我可能听起来很傻。

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

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

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

在这个我得到Stack Over流量计数: - 130156(好的,好的)

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

1 个答案:

答案 0 :(得分:1)

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

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