提问者:小点点

阵列尺寸较大时的分割故障


下面的代码在2GB机器上运行时给我一个分段错误,但在4GB机器上工作。

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

数组的大小仅为4MB。 在C++中可以使用的数组的大小有限制吗?


共3个答案

匿名用户

这里可能只是出现了堆栈溢出。 数组太大,无法容纳程序的堆栈地址空间。

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

int*array=new int[1000000];

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

匿名用户

在C或C++中,本地对象通常是在堆栈上分配的。 您在堆栈上分配了一个大数组,超出了堆栈的处理能力,因此您得到了StackOverflow。

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

这将在作为堆的一部分的BSS段中分配:

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

这将在数据段(也是堆的一部分)中分配:

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

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

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

匿名用户

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

ulimit -s unlimited

但是要小心,记忆是一种有限的资源,强大的力量带来了巨大的责任:)