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