分割错误在大arrays大小

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

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

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

你可能只是在这里得到一个堆栈溢出。 该数组太大,不适合您的程序的堆栈地址空间。

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

int* array = new int[1000000];

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

在C或C ++本地对象通常分配在堆栈上。 你正在堆栈上分配一个大的数组,超过堆栈可以处理,所以你正在得到一个计算器。

不要在堆栈上分配本地,而是使用其他地方。 这可以通过将对象全局化或者在全局堆上分配来实现。 全局variables是好的,如果你不使用任何其他编译单元。 为了确保不会偶然发生,请添加一个静态存储说明符,否则请使用堆。

这将在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和Linux系统上运行,则可以通过以下命令临时增加堆栈大小:

 ulimit -s unlimited 

但要小心,记忆是有限的资源和巨大的权力来承担巨大的责任:)

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

因为您将数组存储在堆栈中。 你应该把它存储在堆中。 看到这个链接来理解堆和堆栈的概念。

Interesting Posts