以下代码在2Gb机器上运行时给出了分段错误,但在4GB机器上运行。
int main()
{
int c[1000000];
cout << "done\n";
return 0;
}
阵列的大小只有4Mb。可以在c ++中使用的数组大小是否有限制?
答案 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 数组,它可以增长到几乎整个内存的大小,而不是您的普通数组。
#include <vector>
#include <iostream>
int main() {
std::vector<int> c(1000000);
std::cout << "done\n";
return 0;
}
然后您可以像往常一样访问数组的元素 c[i]
和/或获取其大小 c.size()
(int
元素的数量)。
如果您想要具有固定维度的多维数组,请混合使用 std::vector 和 std::array,如下所示:
#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;
}