我无法执行代码块中的以下代码,但如果我全局声明数组,那么我可以执行它。
有什么限制全局声明时和本地声明时的数组大小? 在竞争性编程竞赛中声明数组大小的拇指规则是什么?如spoj,codechef等?
此外,如果错误是由codeblock ide引起的。那我怎么纠正呢?
#include<iostream>
using namespace std;
int main()
{
int arr[999999];
return 0;
}
答案 0 :(得分:7)
这是不允许的原因是因为它会在main()的堆栈帧中添加总共999999 * sizeof(int)字节(在典型的64位环境中为7.6MiB),这是一个非常大的单个堆栈帧的内存。
堆栈帧的最大大小取决于您的实现和环境设置。
如果你确实需要这个内存,你应该静态地(使用静态变量)或动态地找到它,这取决于你是否需要在程序中多次调用main()。如果您满足于动态内存,请考虑使用向量而使用std::vector<int> arr(999999);
来声明初始大小设置为999999的向量。
答案 1 :(得分:5)
没有确切的错误(你能提供这个吗?)很难确切地说出发生了什么,但更有可能是你得到了堆栈溢出。堆栈的具体大小是定义的实现,mosst平台提供了扩大它的平均值。
解决此问题的最简单,最正确的方法是使用托管标准容器来保存数组,如std::vector
,这将分配到freestore并为您管理内存,并提供一致的接口
#include <vector>
int main() {
std::vector<int> arr (999999);
return 0;
}
作为一般规则,更喜欢容器到原始数组,只有很少的开销。
答案 2 :(得分:4)
一般来说,在全局范围内声明的变量在ELF可执行文件的.data或.bss部分中“分配”。在方法/函数执行时,在方法/函数内声明的变量(包括向量)是从堆栈动态分配的。堆栈的大小取决于操作系统。
因此,总之这个错误很可能是由于堆栈溢出= D
在编程竞赛(spoj,topcoder,icpc,codejam等)中,动态声明向量是一个好主意。无论是使用vector,malloc还是new。这保证您只使用所需的内存量。