函数和变量范围所需的总堆栈大小如何相关?

use*_*744 8 c++ visual-studio-2010

我正在使用Visual Studio 2010编译我的程序中的堆栈溢出.我有一个宏,在do-while块中,使用在堆栈上分配的小字符数组(8 KiB)执行一些与字符串相关的工作.然后我有一个函数,我在同一范围内多次使用此宏.现在我得到堆栈溢出.

我假设堆栈分配是do-while块的本地,因此当块结束时,数组将不再存在,因此不会影响函数的整体堆栈使用,但看起来我错了.

使用调试器我能够看到在进入函数时,调用了_chkstk().作为此函数的参数,堆栈大小略大于该函数中宏的每次调用的所有8个KiB数组的总和(由于其他局部变量略大).

我用一个简单的例子重新创建了这个问题:

void func(void)
{
    {char a[500000];}
    {char b[500000];}
    {char c[500000];}
    {char d[500000];}
    {char e[500000];}
}
Run Code Online (Sandbox Code Playgroud)

在一个简单的控制台应用程序中,从main()调用此函数将导致堆栈溢出.但是除去一个块语句之外的所有语句都可以正常运行.

我想知道这是否按预期工作?

如何计算函数所需的总堆栈大小?如何计算函数所需的堆栈大小?即使在超出范围之后,堆栈上的数组仍然会影响函数的总堆栈大小?

为什么我在收到堆栈溢出时

nul*_*ptr 0

我想这是特定于编译器的。GCC 也能正常工作:超出范围后,数组会从堆栈中删除(但当所有数组属于同一块时,它会抛出段错误)。