分割错误在大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来分配相同大小的数组。
因为您将数组存储在堆栈中。 你应该把它存储在堆中。 看到这个链接来理解堆和堆栈的概念。