为什么我的多维数组在全局范围内工作,但没有作用域?

Why Does My Multidimensional Array Works Globally, but Not Scoped?

我有一个多维数组,用于表示 1024 * 1024 个 2 字节值。当我在全局范围内声明它时,我的 fstream 能够读入它。当我在调用 file.read 的同一个函数中声明它时,我得到 0xC00000FD(windows 中的堆栈溢出异常?)

下面的工作,程序结束时返回0

下面没有,以0xC00000FD退出

最终,我希望将 textureMap1 变量作为结构的一部分,但在我的故障排除中,我发现我似乎无法读入它,如果不是的话全球宣布。我怀疑这是静态初始化的问题,但我对 C++ 不够熟悉,无法了解其中的细微差别。

为什么全局声明 运行 没有问题,但是一旦我将其移入范围,无论是函数范围还是结构,我都会出现堆栈溢出异常?

编辑

Link 在 pastebin.com

上的单个文件 Header

https://pastebin.com/raw/enLtebEe

要在项目中使用,您需要一份 carnivores2 地图文件的副本,并在一个文件中定义 #STB_OCARN2_IMPLEMENTATION,例如 stb headers.

默认情况下,使用 Microsoft 编译器在 Microsoft Windows 上构建的程序的默认最大堆栈大小约为 1 MB。

宣言

unsigned short textureMap1[1024][1024];

如果将其声明为自动变量,则在堆栈上分配 2 MB。这就是堆栈溢出的原因。

如果您改为将数组声明为全局变量,则不会在堆栈上分配它,因此不会有问题。

堆栈 space 是一种非常有限的资源,尤其是在 Microsoft Windows 上(Linux 具有更大的默认堆栈大小,约为 8 MB)。因此,您通常不应在其上分配超过几千字节,除非您确切地知道自己在做什么。

对于分配如此大量的数据,通常使用动态内存分配会更好,例如new or std::make_unique, or use a container such as std::vector