- ベストアンサー
動的に領域確保した三次元配列でbus errorが発生(Mac OS X 10.5.8 powerPC G5)
- 現在c言語でプログラミングをしているのですが、動的に領域確保した三次元配列に値”0”を入れようとすると、bus errorが発生してしまいます。
- ソースコード内で、M、J、N、Qというint型の定数を使用していることが分かります。
- gdbを使用すると、Program received signal EXC_BAD_ACCESS, Could not access memoryというエラーが表示され、BETA[i][j][k]=0.0;の箇所でbus errorが発生していることがわかります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>"double"だとおもいます。 ですよね。 この考え方を拡張すると、 double ***BETA; と定義したBETAが指すのは、double ** 型ですので、 BETA = (double ***) malloc(sizeof(double **) * M * J); であることに気づきますか? つまり、動的確保を行なう際に、 (double ○○) malloc(sizeof(double △△) * 領域確保したい大きさ); と書いたとき、 ○○ に書く * の数が △△ に書く * の数より1個多い、 という関係があることに気づきますか?
その他の回答 (4)
- asuncion
- ベストアンサー率33% (2127/6289)
>ここが問題になっているのですか? 問題、大ありです。 3次元でなくて1次元の場合を考えてみましょうか。 double *p; というポインターがあって、これが、動的に割り当てたdouble型5個分の領域を指すような コードを考えてみましょうか。 このとき、 p = (double *) malloc(sizeof(○○) * 5); この、○○ には何が入ると思いますか?
補足
"double"だとおもいます。
- osamuy
- ベストアンサー率42% (1231/2878)
> address: 0x00000000 アドレスが明後日の方向にいってるみたいですから、うまく割り当てできてないのでは。 3重にmallocしてないとか。
補足
回答ありがとうございます。 No.1の回答の補足に載せている方法では、 三重にmallocできていないですか?
- asuncion
- ベストアンサー率33% (2127/6289)
sizeof() のカッコの中が、すべて double * になっているのは、どうしてですか?
補足
領域確保部分については、先人のものをコピペして 使わせていただいているので、自分でもよくわからずに 使用してしまっています。 ここが問題になっているのですか?
- asuncion
- ベストアンサー率33% (2127/6289)
>動的に領域確保した三次元配列 >ソースは以下のようになっています そこだけじゃなくって、全体を見せてほしいなぁ、なんて思ったりしています。
補足
回答ありがとうございます。全体だとあまりにも多く なってしまうので、関係ありそうなところをかいつまんで 載せさせていただきます。 double ***BETA,***ALPHA; BETA= (double ***)malloc(sizeof(double *) * M*J); for(i=0;i<M*J;i++){ BETA[i] = (double **)malloc(sizeof(double *) * N); for(j=0;j<N;j++){ BETA[i][j] = (double *)malloc(sizeof(double *) * Q); } } ALPHA= (double ***)malloc(sizeof(double *) * M*J); for(i=0;i<M*J;i++){ ALPHA[i] = (double **)malloc(sizeof(double *) * N); for(j=0;j<N;j++){ ALPHA[i][j] = (double *)malloc(sizeof(double *) * Q); } } for(i=0;i<M*J;i++){ for(j=0;j<N;j++){ for(k=0;k<Q;k++){ BETA[i][j][k]=0.0; ALPHA[i][j][k]=0.0; } } }
お礼
このやり方で書き直したところ、正常に動きました! 判りやすくステップを踏んで教えていただき、大変わかりやすかったです。 ありがとうございました。
補足
なんとなく・・・というとおこられてしまいそうですが、 関係はわかりました!