Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在阵列中存储1000万个数字?_C++_Arrays_Random - Fatal编程技术网

C++ 是否可以在阵列中存储1000万个数字?

C++ 是否可以在阵列中存储1000万个数字?,c++,arrays,random,C++,Arrays,Random,我想知道你们能在数组中存储多少个数字 srand (time(NULL)); int array[10000000]; for(int i = 0; i < 10000000; i++){ array[i] = (rand() % 10000000) + 1; } srand(时间(空)); 整数数组[10000000]; 对于(int i=0;i

我想知道你们能在数组中存储多少个数字

srand (time(NULL));
int array[10000000];
for(int i = 0; i < 10000000; i++){
    array[i] = (rand() % 10000000) + 1;
}
srand(时间(空));
整数数组[10000000];
对于(int i=0;i<10000000;i++){
数组[i]=(rand()%10000000)+1;
}
每次我想在数组中存储10.000.000个数字时,我的程序就会崩溃(Eclipse)。我甚至试过VisualStudio,结果它崩溃了


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

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

堆栈溢出

相反,请尝试以下方法:

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::unique_ptr数组(新整数[10000000]);
或者只使用一个向量,它总是动态地分配其内容(“在堆上”,松散地说):

std::向量数组(10000000);//10000000个元素,全部为零

该语言能够在一个数组中存储10000000个值。但这里的问题是您已经声明10000000个元素存在于堆栈上。堆栈的大小取决于实现,但大多数堆栈没有足够的空间容纳这么多的元素。对于这样的数组,堆是一个更好的地方

int* array = new int[10000000];
for(int i = 0; i < 10000000; i++){
    array[i] = (rand() % 10000000) + 1;
}
...
delete[] array;
int*array=newint[10000000];
对于(int i=0;i<10000000;i++){
数组[i]=(rand()%10000000)+1;
}
...
删除[]数组;

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

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

堆是内存中的另一个区域,编译器通常在其中存储用
new
关键字分配的内容。这通常要大得多,并且能够存储像您这样的大型阵列。把东西放在堆上的缺点是,你必须记住在适当的时候删除它们

在您的示例中,您正在堆栈上声明10000000个元素数组。如果要在堆上声明该数组,可以这样做:

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

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

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

取决于堆栈大小。另外,你应该使用
标题来表示伪随机数。是不是只有我读了这个问题,想象邪恶博士一边用手指扭着嘴角一边说“我想存储1000万个数字”?实际上有两个以上:1)全局变量部分,既不是堆栈也不是堆。2) 常量数据区(可能是只读内存)通常与可执行文件位于同一区域。3) 堆栈,许多编译器使用它来存储函数局部变量。4) 堆,许多编译器使用它来存储动态分配的变量。5) 文件或外部内存。谢谢@ThomasMatthews!我没有想到这些。我对文章进行了编辑,使其更清晰一点。@ThomasMatthews我们不能使数组成为静态的,我试过了,除了在运行之前必须确定固定大小之外,还有什么缺点吗?@SurajJain:数组可以是全局的、文件局部范围的或静态的。有些实现对静态数组的限制比使用动态内存的数组小。@SurajJain:可用内存量以及实现(编译器)和操作系统如何分配内存取决于平台,而不是语言。在各种编译器上打开一些文档,您将看到。检查它们对堆栈变量、自动变量和动态变量的限制。既然您已经说过了,那么您以后如何在函数中实现和调用此数组,“print_out_array(array)”,以及您甚至如何在函数的代码中编写数组,如“void print_out_array(int array[10000000]){?但是您以后如何在函数中调用此数组,或者实际上如何在函数“void print_array(int array[10000000]){…”中写入此数组?
srand (time(NULL));
int* array = new int[10000000];
for(int i = 0; i < 10000000; i++){
    array[i] = (rand() % 10000000) + 1;
}

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