2017-02-11 158 views
2

大きな2次元配列を必要とする小さなC++プログラムがある。エラー:配列の合計サイズは、0x7fffffffバイトを超えてはならない。

int distanceArray[282][9900000]; 

標準の32ビットコンソールアプリケーションでは、32ビットアプリケーションで2GBの上限があるため、この大量のメモリをプロセスに割り当てることができません。私は自分のアプリケーションを構築しようとすると、しかし、私はネイティブAMD64ツールセットを使用するように私のコンパイラを設定しているという事実にもかかわらず、私はまだ同じエラーを取得:

Error C2148 total size of array must not exceed 0x7fffffff bytes 

は、私は私のシステム上のRAMの16ギガバイトを持っているので、I私の身体的記憶は問題ではないはずです。私の計算が正しければ、これは約3GBしか使いません。しかし、なぜ私は64ビットコンパイラが正しく動作するように見えないのか分かりません。私はどのように64ビットコンパイラを使用するかを概説したMicrosoft's websiteの指示に従ったが、私が何をするにしても、私は同じエラーを受け取る。どんな助けでも大歓迎です。ありがとうございました!

私はこの質問が以前に尋ねられていることを知っていますが、既存の回答は私には役に立たなかった。私の問題を見つけるのを手伝ってくれてありがとう、ありがとう。

+0

おそらくスタックがオーバーフローしています。それはプロセスの利用可能なメモリの合計と同じではありません。 'std :: vector >'などを代わりに使用してください。 –

+0

それは通常、実行時にエラーを引き起こすことはありませんか?私はこれを正しくコンパイルすることさえできません。 –

+0

これはコンパイラ特有のものです。私は[ここ](http://coliru.stacked-crooked.com/a/4bfd4b70ce80f332)を再現することはできません。おそらく、特定の開発環境に関するタグと説明を追加するべきでしょう。 –

答えて

1

MSaltersが示唆しているように、std::vector<std::vector<int>>は確かに行く方法でした。まだここに、この問題を持っている人のため

は、私はそれを初期化する方法である:

std::vector<std::vector<int>> distanceArray(282, std::vector<int>(9000000, -1)); 

9,000,000列は282の項目のすべての行の中に作成されており、各値は開始時に-1に初期化されます。

ヘルプにコメントした皆様、ありがとうございます!

3

Windowsで使用される64ビットPECOFF実行形式は、2GBを超えるロードサイズを持つ実行可能ファイルの作成をサポートしていないため、それよりも大きな静的に割り当てられたオブジェクトを作成することはできません。自動的に割り当てられたオブジェクトを使用してスタック上にそのようなオブジェクトを作成しようとすると、同様の問題が発生します。

一つの可能​​な解決策は、オブジェクトを動的に割り当てるために、次のようになります。

int (*distanceArray)[9900000] = (int (*)[9900000]) calloc(282, 9900000); 

それとも、それよりC++ "っぽいをしたいと静的に割り当てられた配列のようにゼロに初期化することを必要としない場合は、次のようになります。

int (*distanceArray)[9900000] = new int[282][9900000]; 
+0

だから、 'std :: vector >'を提案してみてはいかがでしょうか。結局のところ、C++というタグが付いています。 – MSalters

+0

@MSalters私の例は、 'int distanceArray [282] [9900000];とほとんど同じですが、動的に割り当てられることを除いて、ほとんどのコンテキストでは「ドロップイン」置換として使用できます。あなたがそれをもっとC++のものにしたいのであれば、代わりに 'new []'を使うことができます。そうでなければ、ベクトルのベクトルが受け入れられるかどうかという疑問から分からないでしょう。 πάνταῥεbyは既にベクタのベクトルを使用していたので、私は元のポスターがすでに認識していたと仮定したものを繰り返しています。 –

関連する問題