アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在c言語でプログラミングをしているのですが、動的に領域確保した三次元配列に値”0”を入れようとすると、bus error が発生してしまいます。使用しているのはMac OS X 10.5.8 powerPC G5です。

ソースは以下のようになっています
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;
}
}
}
このとき、M、J、N、Qはそれぞれint型の定数です。
gdbしてみると結果はこのようになります。
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00004208 in sum_product_decode (H=0x1001f0, y=0x100880, transH=0x1002c0, get=0x100760, get_ve=0x100790, snr=6, count=0, matrix=0xbffff140, vector=0xbffff020, synd=0xbffff130) at n_b_LDPC.c:626
626 BETA[i][j][k]=0.0;

ご指摘よろしくお願いします。

A 回答 (5件)

>"double"だとおもいます。



ですよね。
この考え方を拡張すると、
double ***BETA;
と定義したBETAが指すのは、double ** 型ですので、
BETA = (double ***) malloc(sizeof(double **) * M * J);
であることに気づきますか?

つまり、動的確保を行なう際に、
(double ○○) malloc(sizeof(double △△) * 領域確保したい大きさ);
と書いたとき、
○○ に書く * の数が △△ に書く * の数より1個多い、
という関係があることに気づきますか?

この回答への補足

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

補足日時:2011/05/01 22:52
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/01 22:59

>ここが問題になっているのですか?



問題、大ありです。
3次元でなくて1次元の場合を考えてみましょうか。

double *p;
というポインターがあって、これが、動的に割り当てたdouble型5個分の領域を指すような
コードを考えてみましょうか。

このとき、
p = (double *) malloc(sizeof(○○) * 5);
この、○○ には何が入ると思いますか?

この回答への補足

"double"だとおもいます。

補足日時:2011/05/01 22:38
    • good
    • 0

> address: 0x00000000


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

この回答への補足

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

補足日時:2011/05/01 22:30
    • good
    • 0

sizeof()


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

この回答への補足

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

補足日時:2011/05/01 22:28
    • good
    • 0

>動的に領域確保した三次元配列


>ソースは以下のようになっています

そこだけじゃなくって、全体を見せてほしいなぁ、なんて思ったりしています。

この回答への補足

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

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

補足日時:2011/05/01 22:19
    • good
    • 0

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