在我的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];
堆栈溢出在代码执行之前发生,因此单元测试顶部的断点不会被命中。知道为什么会这样吗?我有解决方法,但我只是好奇发生了什么。
答案 0 :(得分:4)
char
是1个字节,char*
最有可能是4个字节(可以更多,可以更少)。
所以第一种情况试图分配更多的内存(大约4倍)。堆栈内存有限,只是1000000
个字节适合您平台上的堆栈,但4 * 1000000
没有。
答案 1 :(得分:3)
在32位计算机上,指针是四个字节,因此一百万个指针是四百万个字节(在64位计算机上,指针大小为64位,因此数组为800万个字节)。堆栈通常在1到4兆字节的范围内,因此您char
数组(一百万字节)适合堆栈但指针数组不适合。
答案 2 :(得分:0)