【问题标题】:Is it possible to store 10 million numbers in array?是否可以在数组中存储 1000 万个数字?
【发布时间】:2014-04-30 00:11:31
【问题描述】:

我想知道你可以在数组中存储多少个数字?

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

每次我想在数组中存储 10.000.000 个数字时,我的程序都会崩溃(Eclipse)。我什至尝试了 Visual Studio,但它崩溃了。

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

【问题讨论】:

  • 取决于您的堆栈大小。此外,您应该使用 &lt;random&gt; 标头来获取伪随机数。
  • 只有我读到这个问题,并想象邪恶博士说“我想存储 1000 万个数字”,同时在嘴角扭动手指吗? i.imgur.com/h27654L.jpg

标签: c++ arrays random


【解决方案1】:

有几个地方可以将数组放入内存。我们想到的最常见的区别是 stack 和 heap。

堆栈是计算机跟踪您所在的函数、如何从函数返回以及局部变量的方式。它通常大小有限。确切的限制取决于您的平台,也许还有您编译程序的方式。

堆是内存中的另一个区域,编译器通常存储您使用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 在堆栈上,但它控制的内存在堆上。您以后不必记得删除它,您的程序也不会崩溃。

【讨论】:

  • 其实不止两个: 1) 全局变量段,既不是栈也不是堆。 2) 常量数据区,可能是只读内存,通常和可执行文件是同一个区域。 3)堆栈,许多编译器用来存储函数局部变量。 4) 堆,许多编译器用来存储动态分配的变量。 5) 文件或外部存储器。
  • 谢谢@ThomasMatthews!我没有想到那些。我编辑了帖子以使其更加清晰。
  • @ThomasMatthews 我们不能将数组设为静态,我试过了,有什么缺点吗,除了它必须在运行前确定为固定大小?
  • @SurajJain:数组可以设为全局、文件本地范围或静态。与使用动态内存的实现相比,某些实现对静态数组的限制更小。
  • @SurajJain:可用内存量以及实现(编译器)和操作系统如何分配内存取决于平台而不是语言。打开一些关于各种编译器的文档,你会看到。检查堆栈变量、自动变量和动态变量的限制。
【解决方案2】:

该语言能够在一个数组中存储 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;

【讨论】:

  • 但是你以后如何在函数中调用这个数组,或者实际上你如何将数组写入函数“void print_array (int array[10000000]) {...”?跨度>
【解决方案3】:

你可以存储尽可能多的数字,但你不能那样做。您的程序崩溃的原因是您使用了一个“自动”变量,该变量分配在“堆栈”上。堆栈的大小通常比“堆”更有限,因此使用如此大的自动变量可能会导致...等待它...

堆栈溢出!

试试这个:

int* array = new int[10000000];

然后使用后:

delete[] array;

第二步是学习智能指针;在这种情况下,您可以使用 boost::scoped_array 之类的东西,但有很多选项取决于您喜欢的库(或者如果您有 C++11)。

如果你有 C++11,你可以使用“RAII”来避免需要记住何时何地调用 delete。只需这样做来分配数组:

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

或者只是使用一个向量,它总是动态分配其内容(“在堆上”,松散地说):

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

【讨论】:

  • 既然你已经说了,你怎么能在稍后的函数中实现和调用这个数组,“print_out_array(array)”,还有你怎么把数组写在代码中像“void print_out_array (int array[10000000]) {...”这样的函数?
猜你喜欢
  • 2013-10-31
  • 2018-07-19
  • 1970-01-01
  • 2018-10-17
  • 2013-10-23
  • 2017-12-11
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
相关资源
最近更新 更多