8

我无法在代码块 ide中执行以下代码,但如果我全局声明数组,那么我可以执行它。
全局声明和本地声明时数组大小有哪些限制?在 spoj、codechef 等竞争性编程竞赛中声明数组大小的经验法则是什么?
此外,如果错误是由于代码块 ide 引起的。那我该如何纠正呢?

#include<iostream>

using namespace std;


int main()
{
    int arr[999999];

    return 0;
}
4

3 回答 3

7

不允许这样做的原因是因为它将总共 999999*sizeof(int) 字节(在典型的 64 位环境中为 7.6MiB)添加到 main() 的堆栈帧,这对于一个非常大的内存量单栈帧。

堆栈帧的最大大小取决于您的实现和环境设置。

如果您确实需要此内存,您应该静态地(使用静态变量)或动态地定位它,这取决于您是否需要在程序中多次调用 main()。如果您满足于动态内存,请考虑改用向量并使用std::vector<int> arr(999999);以声明初始大小设置为 999999 的向量。

于 2012-11-21T13:25:21.693 回答
5

如果没有确切的错误(你能提供这个吗?),很难准确地说出发生了什么,但你很可能会遇到堆栈溢出。堆栈的具体大小是由实现定义的,大多数平台都提供了一种扩大它的方法。

解决这个问题最简单、最正确的方法是使用托管标准容器来保存数组,如 a std::vector,这将分配到 freestore 并为您管理内存并提供一致的接口。

#include <vector>
int main() {
     std::vector<int> arr (999999);
     return 0;
}

作为一般规则,与原始数组相比,更喜欢容器,这几乎没有开销。

参考

http://en.cppreference.com/w/cpp/container/vector

于 2012-11-21T13:26:06.967 回答
4

一般来说,在全局范围内声明的变量在 ELF 可执行文件的 .data 或 .bss 部分中“分配”。在方法/函数内部声明的变量(包括向量)在方法/函数执行时从堆栈中动态分配。堆栈的大小取决于操作系统。

所以,总而言之,这个错误很可能是由于堆栈溢出=D

在编程竞赛(spoj、topcoder、icpc、codejam 等)中动态声明向量是一个好主意。无论是使用vector,malloc还是new。这保证您只使用所需的内存量。

于 2012-11-21T13:29:56.040 回答