重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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];
・・・}}

☆:エラー発生."保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。"

A 回答 (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]と逆になっているのでプログラムを直したほうが良いですよ。
    • good
    • 0
この回答へのお礼

ありがとうございます!
添え字が逆との指摘,修正したら確保できました。
お礼が遅くなってしまいましたが,
ありがとうございました!

お礼日時:2009/02/01 17:02

>System.StackOverflowException


スタックサイズはコンパイラによって設定可能です。
GCCやVCではデフォルト1MBとされていますが、
環境によっては変更できないので、お勧めできません。

> L[j][k] = new double[10];//
既に出てますが、ここで普通に
アクセス違反していますね。
正しくはL[k][j]。
    • good
    • 0
この回答へのお礼

ありがとうございます!
お礼が遅くなってしまいましたが,
無事確保できました!

お礼日時:2009/02/01 17:02

普通にmalloc使いましょうよ


スタックを12MBも要求するなんてコードレビューで間違いなく糞コード認定ですよ
    • good
    • 0
この回答へのお礼

ありがとうございます!
それまでmallocもnewも恥ずかしながら存在すら知らなかったのですが
今回はnewの方を使用しました

お礼日時:2009/02/01 17:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!