大数组大小的分段错误

时间:2009-12-04 15:41:25

标签: c++ arrays segmentation-fault

以下代码在2Gb机器上运行时给出了分段错误,但在4GB机器上运行。

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}

阵列的大小只有4Mb。可以在c ++中使用的数组大小是否有限制?

7 个答案:

答案 0 :(得分:109)

你可能只是在这里得到一个堆栈溢出。该数组太大,无法放入程序的堆栈地址空间。

如果你在堆上分配数组,你应该没问题,假设你的机器有足够的内存。

int* array = new int[1000000];

但请记住,这需要你delete[]数组。更好的解决方案是使用std::vector<int>并将其大小调整为1000000个元素。

答案 1 :(得分:49)

在C或C ++中,本地对象通常在堆栈上分配。您正在堆栈上分配一个大型数组,超过堆栈可以处理的数组,因此您获得了stackoverflow.

不要在堆栈上本地分配,而是使用其他地方。这可以通过使对象全局或在全局上分配它来实现。如果不使用任何其他编译单元,则全局变量很好。为确保不会发生这种情况,请添加静态存储说明符,否则只需使用堆。

这将在BSS段中分配,这是堆的一部分:

static int c[1000000];
int main()
{
   cout << "done\n";
   return 0;
}

这将在DATA段中分配,这也是堆的一部分:

int c[1000000] = {};
int main()
{
   cout << "done\n";
   return 0;
}

这将在堆中的某个未指定位置分配:

int main()
{
   int* c = new int[1000000];
   cout << "done\n";
   return 0;
}

答案 2 :(得分:10)

此外,如果您在大多数UNIX&amp; Linux系统可以通过以下命令临时增加堆栈大小:

ulimit -s unlimited

但是要小心,记忆是一种有限的资源,并且有很大的力量来承担很大的责任:)

答案 3 :(得分:2)

在这种情况下,您正在堆栈上分配数组,尝试使用alloc分配相同大小的数组。

答案 4 :(得分:2)

因为您将数组存储在堆栈中。您应该将它存储在堆中。请参阅this link以了解堆和堆栈的概念。

答案 5 :(得分:0)

您的普通数组在堆栈中分配,堆栈限制为几兆字节,因此您的程序会出现堆栈溢出和崩溃。

可能最好使用基于堆分配的 std::vector 数组,它可以增长到几乎整个内存的大小,而不是您的普通数组。

Try it online!

#include <vector>
#include <iostream>

int main() {
   std::vector<int> c(1000000);
   std::cout << "done\n";
   return 0;
}

然后您可以像往常一样访问数组的元素 c[i] 和/或获取其大小 c.size()int 元素的数量)。

如果您想要具有固定维度的多维数组,请混合使用 std::vectorstd::array,如下所示:

Try it online!

#include <vector>
#include <array>
#include <iostream>

int main() {
   std::vector<std::array<std::array<int, 123>, 456>> c(100);
   std::cout << "done\n";
   return 0;
}

在上面的示例中,您获得的行为与分配普通数组 int c[100][456][123]; 几乎相同(除了向量在堆上而不是堆栈上分配),您可以像在普通数组中一样访问 c[10][20][30] 元素。上面的示例还在堆上分配数组,这意味着您可以将数组大小设置为整个内存大小,而不受堆栈大小的限制。

要获取指向向量中第一个元素的指针,请使用 &c[0] 或仅使用 c.data()

答案 6 :(得分:0)

还有一种方法对我有用! 您可以通过更改其数据类型来减小数组的大小:

    int main()
        {
        short c[1000000];
        cout << "done\n";
        return 0;
        }

  int main() 
  {
      unsigned short c[1000000];
      cout << "done\n";
      return 0;
  }