Const char声明导致堆栈溢出

时间:2013-03-08 09:29:43

标签: c++ visual-studio-2012 const stack-overflow cppunit

在我的VC ++ CPPUNIT项目中,单元测试中的以下代码会导致堆栈溢出异常:

const int n = 1000000;
const char *test[n];
  

Utilities_Tests.exe中0x00AD89E7处的第一次机会异常:   0xC00000FD:堆栈溢出(参数:0x00000000,0x00132000)。   Utilities_Tests.exe中0x00AD89E7处的未处理异常:0xC00000FD:   堆栈溢出(参数:0x00000000,0x00132000)。

但这不是:

const int n = 1000000;
char test[n];

堆栈溢出在代码执行之前发生,因此单元测试顶部的断点不会被命中。知道为什么会这样吗?我有解决方法,但我只是好奇发生了什么。

3 个答案:

答案 0 :(得分:4)

char是1个字节,char*最有可能是4个字节(可以更多,可以更少)。

所以第一种情况试图分配更多的内存(大约4倍)。堆栈内存有限,只是1000000个字节适合您平台上的堆栈,但4 * 1000000没有。

答案 1 :(得分:3)

在32位计算机上,指针是四个字节,因此一百万个指针是四百万个字节(在64位计算机上,指针大小为64位,因此数组为800万个字节)。堆栈通常在1到4兆字节的范围内,因此您char数组(一百万字节)适合堆栈但指针数组不适合。

答案 2 :(得分:0)

这是因为你的堆栈空间不足。堆栈空间是有限的每线程资源;进行嵌套函数调用并使用局部变量会消耗它。当你用完时,会发生堆栈溢出。

您的第一个示例分配了一百万char*,通常为4MB或8MB内存。您的第二个示例仅分配1MB。分配的堆栈空间的典型大小也约为1MB,因此结果并不令人惊讶。

有关可能的解决方案,请参阅herehere