动态数组与静态数组的大小

Size of dynamic array vs static array

本文关键字:数组 静态 动态      更新时间:2023-10-16

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

StackOverflow.exe中0x011164A7的未处理异常:0xC00000FD: Stack overflow(参数:0x00000000, 0x00482000)

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

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

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

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

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

请注意,这与您拥有的物理内存量无关。即使在RAM少于1 GB的机器上,您也可以分配2 GB的阵列……它只是会很慢,因为大多数数组将在虚拟内存中,交换到磁盘。