【问题标题】:Size of dynamic array vs static array动态数组与静态数组的大小
【发布时间】:2014-07-21 02:28:14
【问题描述】:

静态数组和动态数组的最大大小是多少?我认为动态数组没有限制,但为什么静态数组的大小是有限的?

【问题讨论】:

  • 没有这样的范围。很大程度上取决于您的机器配置。
  • @Digital_Reality 我问原因 int Data[8][499][15]; 在我的电脑上失败
  • 只有 29MB 的存储空间。我想,可能有其他分配导致了这种情况。
  • 这也取决于编译器,一些编译器可能会将分配从堆栈移到堆中。
  • 在您对 shekhar 的回答的评论中,您提到相反,它会转储。这意味着它可以编译。另外,“类变量”是指它是静态成员吗​​?

标签: c++ c arrays


【解决方案1】:

StackOverflow.exe 中 0x011164A7 处未处理的异常:0xC00000FD:堆栈溢出(参数:0x00000000、0x00482000)

这看起来更像是运行时错误。更准确地说 - 堆栈溢出。

在大多数地方,数组的大小仅受可用内存的限制。但是,堆栈分配对象的限制通常要严格得多。默认情况下,它在 Windows 上为 1Mb,在 Linux 上为 8Mb。看起来您的数组和堆栈上的其他数据占用的空间超过了限制。

有几种方法可以避免此错误:

  1. 创建此数组static 或在模块的顶层声明它。这样它将被分配到.bss 段而不是堆栈中。
  2. 使用malloc/new 在堆上显式分配此数组。
  3. 使用 C++ 集合(例如 std::vector)而不是数组。
  4. 增加堆栈大小限制。在 Linux 上,这可以通过 ulimit -s unlimited 完成

【讨论】:

  • gcc 也有一个增加堆栈大小的开关。在我的系统上,它可以超过 1GB(默认为 2MB)。
【解决方案2】:

数组的最大大小由程序可以访问的内存量决定。在 32 位系统上,指针可以寻址的最大内存量为 2^32 字节,即 4 GB。实际限制可能会更少,具体取决于操作系统的实现细节。

请注意,这与您可用的物理内存量无关。即使在一台 RAM 远低于 1 GB 的机器上,您也可以分配一个 2 GB 的数组……这会很慢,因为大部分数组都在虚拟内存中,然后换出到磁盘。

【讨论】:

  • 我有 struct(232 B) 并以这种方式分配它 `struct_name Data[8][499][15];那么为什么它在编译时失败了?
  • @Quest 你使用的是什么编译器,你遇到了什么错误?
  • @Banthar 这就是我所能看到的:StackOverflow.exe 中 0x011164A7 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000、0x00482000)。 VC++ 2013
  • 这一切都可能发生,因为您的计算机环境不适合执行此数组分配!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2011-02-09
  • 2018-07-29
  • 2012-11-15
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多