2009-08-11 14 views
2

配列を宣言したい: int a [256] [256] [256] そしてプログラムがハングする。 (私は既に他のすべてのコードをコメントアウトしています...) int [256] [256]を試すと大丈夫です。C++で多次元配列がハング

私はMingW C++コンパイラ、Eclipse CDTを使用しています。

私のコードは: int main(){ int a [256] [256] [256]; return 0; }

コメントは歓迎されます。

+0

「他のすべてのコードをコメントアウトする」とはどういう意味ですか? 'int a [256] [256] [256]'と空のメインメソッド 'int main(){}'からなるプログラムがハングすることを意味しますか? –

+0

実際のコードは大歓迎です。 – Alex

+5

256 * 256 * 256は1600万要素です。あなたの配列は32ビットシステムで64メガバイトです。現代のシステムでは不合理ではありませんが、(関数の中で)スタックに割り振っているのであれば、おそらくあなたのコンパイラやOSよりも大きいでしょう。 –

答えて

10

これは、配列が関数に対してローカルである場合に発生する可能性があります。その場合、2^24の整数(2^26バイト、または64MB)を保持するのに十分なスタックサイズが必要です。

アレイをグローバルにすると、動作するはずです。 Windowsでスタックサイズを変更する方法がわかりません。 Linuxでは "ulimit -s 10000"(単位はKB)を使います。

グローバル(並行性または再帰)を使用しないのがよい理由がある場合は、malloc/freeを使用できます。重要なことは、スタックを増やす(スレッドを使用している場合は良い考えではない)か、ヒープ(malloc/free)または静的データセグメント(グローバル)でデータを取得することです。

理想的には、プログラム終了(コアダンプ)が発生し、ハングアップしません。私はcygwinでやっています。他の人が指摘したように、あなたのコードでは、あなたが配列を割り当てている

alt text http://bweaver.net/files/stackoverflow1.jpg

、ので:

+0

+1、私にそれを打つ! mallocまたはnew []を使ってヒープからメモリを割り当てると、問題が解決するでしょう。 –

+0

スタックから64MBを食べようとすると、おそらく問題になる可能性があります。 –

0

16MBの空き連続メモリがないのでしょうか?想像するのは難しいですが、可能...

+0

@bkritzer:64MB; intは4バイトです。 8-) – RichieHindle

+0

「int」部分に注意を払っていませんでした。 – bkritzer

0

は、あなたがこのような何かを取得し、それ以外の場合、この

#include <malloc.h> 
int main() 
{ 
    int *a; 
    a = (int*)malloc(256*256*256*sizeof(int)); // allocate array space in heap 
    return 0; 
} 

ような何かをしたいです積み重ねて、それを吹く。

mallocまたはその友人を介して配列を割り当てることは、方法です。 (あなたがそのルートに行く必要がある場合は、グローバルに作成することもできます)