下面的代码在2GB机器上运行时给我一个分段错误,但在4GB机器上工作。
int main()
{
int c[1000000];
cout << "done\n";
return 0;
}
数组的大小仅为4MB。 在C++中可以使用的数组的大小有限制吗?
这里可能只是出现了堆栈溢出。 数组太大,无法容纳程序的堆栈地址空间。
如果您在堆上分配了数组,那么您应该没有问题,假设您的机器有足够的内存。
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
但是要小心,记忆是一种有限的资源,强大的力量带来了巨大的责任:)