• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:動的に領域確保した三次元配列のbus error)

動的に領域確保した三次元配列でbus errorが発生(Mac OS X 10.5.8 powerPC G5)

このQ&Aのポイント
  • 現在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が発生していることがわかります。

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

>"double"だとおもいます。 ですよね。 この考え方を拡張すると、 double ***BETA; と定義したBETAが指すのは、double ** 型ですので、 BETA = (double ***) malloc(sizeof(double **) * M * J); であることに気づきますか? つまり、動的確保を行なう際に、 (double ○○) malloc(sizeof(double △△) * 領域確保したい大きさ); と書いたとき、 ○○ に書く * の数が △△ に書く * の数より1個多い、 という関係があることに気づきますか?

yodametabon
質問者

お礼

このやり方で書き直したところ、正常に動きました! 判りやすくステップを踏んで教えていただき、大変わかりやすかったです。 ありがとうございました。

yodametabon
質問者

補足

なんとなく・・・というとおこられてしまいそうですが、 関係はわかりました!

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>ここが問題になっているのですか? 問題、大ありです。 3次元でなくて1次元の場合を考えてみましょうか。 double *p; というポインターがあって、これが、動的に割り当てたdouble型5個分の領域を指すような コードを考えてみましょうか。 このとき、 p = (double *) malloc(sizeof(○○) * 5); この、○○ には何が入ると思いますか?

yodametabon
質問者

補足

"double"だとおもいます。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

> address: 0x00000000 アドレスが明後日の方向にいってるみたいですから、うまく割り当てできてないのでは。 3重にmallocしてないとか。

yodametabon
質問者

補足

回答ありがとうございます。 No.1の回答の補足に載せている方法では、 三重にmallocできていないですか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

sizeof() のカッコの中が、すべて double * になっているのは、どうしてですか?

yodametabon
質問者

補足

領域確保部分については、先人のものをコピペして 使わせていただいているので、自分でもよくわからずに 使用してしまっています。 ここが問題になっているのですか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>動的に領域確保した三次元配列 >ソースは以下のようになっています そこだけじゃなくって、全体を見せてほしいなぁ、なんて思ったりしています。

yodametabon
質問者

補足

回答ありがとうございます。全体だとあまりにも多く なってしまうので、関係ありそうなところをかいつまんで 載せさせていただきます。 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; } } }

関連するQ&A