我在使用 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];}
}
在简单的控制台应用程序中,从 main() 调用此函数将导致堆栈溢出。但是,删除除一个块语句之外的所有语句都可以正常运行。
我想知道这是否按预期工作?
如何计算函数所需的总堆栈大小?如何计算函数所需的堆栈大小?即使超出范围,堆栈上的数组仍然会影响函数的总堆栈大小?
为什么我得到堆栈溢出时