为什么我的多维数组在全局范围内工作,但没有作用域?
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
。
我有一个多维数组,用于表示 1024 * 1024 个 2 字节值。当我在全局范围内声明它时,我的 fstream
能够读入它。当我在调用 file.read
的同一个函数中声明它时,我得到 0xC00000FD(windows 中的堆栈溢出异常?)
下面的工作,程序结束时返回0
下面没有,以0xC00000FD退出
最终,我希望将 textureMap1
变量作为结构的一部分,但在我的故障排除中,我发现我似乎无法读入它,如果不是的话全球宣布。我怀疑这是静态初始化的问题,但我对 C++ 不够熟悉,无法了解其中的细微差别。
为什么全局声明 运行 没有问题,但是一旦我将其移入范围,无论是函数范围还是结构,我都会出现堆栈溢出异常?
编辑
Link 在 pastebin.com
上的单个文件 Headerhttps://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
。