是否有可能在阵列中存储1000万个数字?

时间:2014-03-22 14:30:00

标签: c++ arrays random

我想知道你能在阵列中存储多少个数字?

srand (time(NULL));
int array[10000000];
for(int i = 0; i < 10000000; i++){
    array[i] = (rand() % 10000000) + 1;
}

每次我想在数组中存储10.000.000个数字时,我的程序崩溃了(Eclipse)。我甚至试过Visual Studio并且它崩溃了。

所以我想知道我可以在数组中存储多少个数字,或者我的代码有问题?

3 个答案:

答案 0 :(得分:17)

你可以存储尽可能多的数字,但你不能这样做。程序崩溃的原因是你正在使用&#34;自动&#34;变量,在&#34;堆栈上分配。&#34;堆栈的大小比#&#34;堆&#34;更受限制。通常,因此使用如此大尺寸的自动变量可能会导致......等待它......

STACK OVERFLOW!

相反,试试这个:

int* array = new int[10000000];

然后使用它:

delete[] array;

第二步将学习智能指针;在这种情况下,您可以使用类似boost::scoped_array的内容,但根据您喜欢的库(或者如果您使用的是C ++ 11),有很多选项。

如果你有C ++ 11,你可以使用&#34; RAII&#34;避免需要记住何时何地调用删除。只需这样做来分配数组:

std::unique_ptr<int[]> array(new int[10000000]);

或者只使用一个向量,它总是动态地分配它的内容(&#34;在堆上#34;,松散地说):

std::vector<int> array(10000000); // 10000000 elements, all zero

答案 1 :(得分:6)

该语言能够在数组中存储10,000,000个值。这里的问题是你已经宣布堆栈中存在10,000,000个元素。堆栈的大小取决于实现,但大多数堆栈根本没有足够的空间来容纳那么多元素。对于这样的数组

,堆是一个更好的地方
int* array = new int[10000000];
for(int i = 0; i < 10000000; i++){
    array[i] = (rand() % 10000000) + 1;
}
...
delete[] array;

答案 2 :(得分:0)

有几个地方可以把你的阵列放在内存中。我们考虑的最常见的区别是堆栈

堆栈是计算机如何跟踪您所处的功能,如何从函数返回以及本地变量。它的大小通常有限。确切的限制取决于您的平台,也可能取决于您编写程序的方式。

堆是内存中的另一个区域,编译器通常会存储您使用new关键字分配的内容。这通常要大得多,并且能够存储像你这样的大阵列。将事情保持在堆上的缺点是你必须在适当的时候记住delete它们。

在您的示例中,您在堆栈上声明10,000,000个元素数组。如果你想在堆上声明那个数组,你可以这样做:

srand (time(NULL));
int* array = new int[10000000];
for(int i = 0; i < 10000000; i++){
    array[i] = (rand() % 10000000) + 1;
}

//Sometime later...
delete[] array;

但是,C ++为我们提供了更好的工具。如果您想要一个大数组,请使用std::vector

srand (time(NULL));
std::vector<int> array(10000000);
for(std::size_t i = 0; i < array.size(); i++){
    array[i] = (rand() % 10000000) + 1;
}

现在,您的std::vector位于堆栈中,但它控制的内存位于堆上。您不必记得以后删除它,并且您的程序不会崩溃。