- ベストアンサー
3次元配列使用でStackOverflowException発生
C++で3次元配列を使用したいのですが,強制終了させられてしまいます. おそらくスタックオーバーフローというものが起こっているようなのですが, double L[10][500][30],a[10][500][30],b[10][500][30],… というふうに, 10*500*30の要素数の配列を全部で10種類使用するのはやはりメモリ的に無理があるのでしょうか? コード作成はVisual Studio 2008,コンパイラはgccで実行しています. あまりこの要素数は減らしたくないのですが, 何か解決策があれば教えてください. ------------------------------------------------------------ 環境:WinXP, メモリ1GB, Pentium4 ちなみに,いくつか対策を講じて見ましたが,エラーが出てしまった例を一応下に載せておきます. <VisualStudioでデバッグ有りのコンパイル> エラー."System.StackOverflowException' のハンドルされていない例外が発生しました" <new()を使用した配列の動的確保> double ***L, ***a, ・・・; L = new double**[30];// double型30個分の領域を動的確保 a = new double**[30]; … for(k=0; k<=30; k++){ L[k] = new double*[500];// double型500個分の領域を動的確保 a[k] = new double*[500]; ・・・} for(k=0; k<=30; k++){ for(j=0;j<=500; j++){ ☆L[j][k] = new double[10];// double型10個分の領域を動的確保 a[j][k] = new double[10]; ・・・}} ☆:エラー発生."保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。"
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ローカル変数はスタックに格納されます。スタック上に1MB越えをする配列を10個とる事など大体のOSの実装では想定されていません。 グローバル変数か、newかmallocでの確保が必要です。 でnewでの確保の失敗ですが、 ☆L[j][k] = new double[10];// double型10個分の領域を動的確保 a[j][k] = new double[10]; 添え字のjとkが逆ですよ。 今のプログラムだとL[30][500][10]の配列としてアクセスする必要があります。元のdouble L[10][500][30]と逆になっているのでプログラムを直したほうが良いですよ。
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
>System.StackOverflowException スタックサイズはコンパイラによって設定可能です。 GCCやVCではデフォルト1MBとされていますが、 環境によっては変更できないので、お勧めできません。 > L[j][k] = new double[10];// 既に出てますが、ここで普通に アクセス違反していますね。 正しくはL[k][j]。
お礼
ありがとうございます! お礼が遅くなってしまいましたが, 無事確保できました!
普通にmalloc使いましょうよ スタックを12MBも要求するなんてコードレビューで間違いなく糞コード認定ですよ
お礼
ありがとうございます! それまでmallocもnewも恥ずかしながら存在すら知らなかったのですが 今回はnewの方を使用しました
お礼
ありがとうございます! 添え字が逆との指摘,修正したら確保できました。 お礼が遅くなってしまいましたが, ありがとうございました!