代码之家  ›  专栏  ›  技术社区  ›  Goldentoa11

为什么我的多维数组是全局工作的,而不是作用域?

  •  0
  • Goldentoa11  · 技术社区  · 3 年前

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

    下面的操作有效,程序完成后返回0

    global md initialization

    以下情况不适用,使用0xC00000FD退出

    stack overflow exception

    最后,我想要 textureMap1 变量作为结构的一部分,但在我的故障排除中,我发现如果它不是全局声明的,我似乎无法读入它。我怀疑这与静态初始化有关,但我对C++不够熟悉,不知道其中的细微差别。

    为什么全局声明运行时没有问题,但只要我将其移动到一个作用域中,无论是函数作用域还是结构,就会出现堆栈溢出异常?

    编辑

    链接到pastebin上的单个文件头。通用域名格式

    https://pastebin.com/raw/enLtebEe

    要在项目中使用,您需要一个carnivores2地图文件的副本,以及在一个文件中定义#STB_OCARN2_实现,如STB头文件。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Andreas Wenzel    3 年前

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

    宣言

    unsigned short textureMap1[1024][1024];
    

    如果将堆栈声明为自动变量,则在堆栈上分配2MB。这就是为什么在你的情况下堆栈会溢出。

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

    堆栈空间非常有限,尤其是在Microsoft Windows上(Linux的默认堆栈大小约为8 MB)。因此,除非您确切知道自己在做什么,否则通常不应该在上面分配超过几千字节的数据。

    对于分配如此大量的数据,通常最好使用动态内存分配,例如 new std::make_unique ,或使用容器,如 std::vector .