8

コードブロック ide で以下のコードを実行できませんが、配列をグローバルに宣言すると実行できます。
グローバルに宣言された場合とローカルに宣言された場合の配列サイズの制限は何ですか? spoj、codechefなどの競争力のあるプログラミングコンテストで配列サイズを宣言するための経験則は何ですか?
また、エラーが codeblock 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

正確なエラーがなければ (これを提供できますか?) 何が起こっているのかを正確に言うのは困難ですが、スタック オーバーフローが発生している可能性が高いです。スタックの特定のサイズは実装によって定義され、ほとんどのプラットフォームはそれを拡大する手段を提供します。

この問題に対する最も簡単で最も正しい解決策は、管理された標準コンテナーを使用して のような配列を保持することstd::vectorです。これにより、フリーストアに割り当てられ、メモリが管理され、一貫したインターフェイスが提供されます。

#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 に答える