2012-01-29 6 views
4

DP関連の問題を解決しながら、最初に動作するが、2番目のsegフォルトが発生することがわかりました。 実際の理由は何ですか?intを使用するだけのメモリ制限は何ですか?大きな2次元配列を持つ:static int vs int

int main(){ 
    static int a[3160][3160]; 
    return 0; 
} 

int main(){ 
    int a[3160][3160]; 
    return 0; 
} 
+0

[配列サイズの制限](http://stackoverflow.com/questions/9016538/array-size-limits) –

答えて

5

おそらく、その大きな配列を格納するのに十分なスタックメモリがないためです。

第2の例では、スタック上に配列を作成しますが、最初の例では、static修飾子を使用して明示的に記憶域基準を指定するため、スタック上に配置されずdata/Bssセグメント内の配列が作成されます。

stackまたはheapまたはdata segmentまたはBss segmentこれらはすべて実装定義の詳細です。標準では、異なる記憶域基準で宣言された変数に対して期待される動作のみを指定します。だから、変数が実際にあるは、実装定義されているが、その地域での十分なメモリがないので確実である、両方のあなたの例では、異なるメモリ領域と第二1つのクラッシュで配列を作成するために一つのことです作成しました。あなたが実際の実装では、このような巨大な次元の配列を作成している場合

また、おそらくあなたのデザインが欠陥と思われる、あなたはそれを再訪検討する必要があります。

はまた、代わりに伝統的なCスタイルの配列のstd::arrayまたはstd::vectorを、使用して検討する必要があります。

+0

の可能な複製 "異なるメモリ領域に配列を作成する例"ニース、他の答えがなければ、私はこれをマークします:) –

1

ラージ・アロケーションが安全でない(その保証を履行しない限り)スタック割り当て。

スタックサイズは、プラットフォーム/ハードウェアによって異なります。したがって、 'メモリの制限'は劇的に変化します。このような巨大なスタック配列を使用する場合は、開発用に使用しているプロセッサ以外のプロセッサでプログラムを実行するときに、このエラーを頻繁に確認する準備が必要です。 の場合、絶対にのスタックが必要な場合は、明示的なスタックサイズで独自のスレッドを作成する必要があります。

ただし、ダイナミックアロケーションをここで使用する必要があるため、この数値は必要ありません。

staticは、再入可能にする必要がある場合はお勧めできません。

Alsが指摘したように(+1)、ランタイムエラーの原因はスタックサイズの可能性が非常に高いためです。

関連する問題