c++ - 声明多维数组时出现堆栈溢出异常

标签 c++ arrays pointers multidimensional-array stack-overflow

总的来说,我对编程有些陌生,我遇到了声明 3D 和 4D 数组的问题。我在 main 函数的开头有几个这样的声明,但我已将问题缩小到这 4 个:

string  reg_perm_mark_name[64][64][64];
short   reg_perm_mark_node_idex[64][64][64];
short   reg_perm_mark_rot[64][64][64][4];
short   reg_perm_mark_trans[64][64][64][3];

当我用这些运行我的程序时,我在我的可执行文件中得到“System.StackOverflowException”。我更喜欢动态分配它们的方式,我现在拥有的方式无论如何都是临时的,我不确定如何正确声明数组指针。

例如,我在 4D 数组 reg_perm_mark_trans 中使用的 4 个元素是 [node index][region index][marker index][xyz coordinates]。此外,一次声明了总共 35 个多维数组。 (其中大部分是 1D 和 2D)我不确定这是否有帮助。

谁能告诉我如何使这些 4d 数组工作或者如何使它们动态分配指针或 vector ?请描述一下,我还在学习。

最佳答案

为简单起见,假设 sizeof(string) == 2(可能更多),您正在尝试在堆栈上分配 (64^3)*9*2 字节。结果是 4,718,592 字节,或大约 4.5 MiB。最有可能的是,您的堆栈上没有 4.5 MiB 可用。

由于这些变量是在 main() 中声明的,因此您有两种可能的解决方案:

  1. 将它们声明为static

  2. main() 之外声明它们,作为全局变量。

这将导致它们在程序开始之前就被分配,而不是在堆栈上。这两种方法之间的唯一区别在于它们是否在其他函数中可见。

也许还有一种方法可以告诉您的编译器该程序需要更多堆栈空间,但我认为将它们设为静态可能是更好的解决方案。但是,如果它们在 main() 以外的函数中,您可能需要做其他事情。

关于c++ - 声明多维数组时出现堆栈溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31352381/

相关文章:

c++ - std::cin.fail()问题

c - 在C中,如何读取地址前的内存块

c - 为什么我不能将像 scanf() 或 gets() strcat() strcpy() 这样的字符串函数与字符指针变量一起使用?

c++ - 比较悬空指针是否合法?

c# - 异常从非托管代码传播到托管代码?

c++ - 检查序列中的位模式

c++ - 最优雅的循环结构?

c - 下标值既不是数组,也不是指针,也不是数组索引处的 vector

javascript - 从数组中选择单个对象以在 View 中显示 [Angular]

python - 将 2d numpy 数组转换为列表列表