0

在我的 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];

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

4

3 回答 3

4

Achar是 1 个字节,achar*很可能是 4 个字节(可以更多,也可以更少)。

因此,第一种情况尝试为堆栈分配更多内存(约 4 倍)。堆栈内存是有限的,只是碰巧1000000字节适合堆栈上的平台,但4 * 1000000不适合。

于 2013-03-08T09:31:34.793 回答
3

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

于 2013-03-08T09:32:02.767 回答
0

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

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

有关可能的解决方案,请参见此处此处

于 2013-03-08T09:31:56.163 回答