- ベストアンサー
構造体のポインタ参照
構造体のプログラムを作成しており、コンパイルを行った際にエラーが起きてしまいました。 以下に構造体宣言とメイン関数のプログラムをとエラーが出てしまった部分を記述します。 エラー表示の内容として「不完全型ポインタへの間接参照」と出ました。 自分なりに考えた結果、ポインタの参照部分に間違いがあるためエラーが起こったと思います。そのエラーが生じた部分のプログラムをどのように修正すればコンパイルが成功するか、ご教授のほうお願いします。 /* 構造体宣言 */ typedef struct { int m; double *a; double *alpha; }PREDICTOR; int main(){ struct PREDICTOR *pred; int i; /* ここでエラーが起きました */ pred -> a[0] = pred -> a[1] =0; pred -> m = 0; pred -> alpha = r(0); /* ここまで */ for(i = 0; i < M; i++){ pred = levin(pred); } return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
エラーメッセージが見てないからなんともいえませんが・・・。変だなぁと思う点。 1)predの実態がない。 これでは、コンパイルがもし通っても実行時に 不正なメモリ領域へのアクセスが原因で死にます。 struct PREDICTOR *pred; の後に。 struct PREDICTOR realPred; pred = &realPred; を追加したり、 pred = (struct PREDICTOR*)malloc(sizeof(struct PREDICTOR)); などを追加すべきです。 mallocを使う場合はfree()を忘れずに。 2)aはdoubleなので、初期値は0.0や0.にすべきかな。 3)aの実態がない。 これは(1)と同じ理屈です。 実態がないのに、 pred->a[0]とか、pred->a[1]に値を格納しようとすると、コンパイルが通ったとしても実行時に死にます。 関数r()がなにをするものなのかは知りませんので、 alphaについてはなにも言えません。 以上。
その他の回答 (1)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
実行時に問題が出る場面は、 No.1 で指摘のあるとおりです。 でも、コンパイルが通らないというのは、 struct PREDICTOR *pred; に sturuct があるからではないでしょうか? 構造体を PREDICTOR に typedef しているので、ここには、struct は不要です。 (でも、だったら、PREDICTOR の定義に関してエラーが出るはずですが)
お礼
回答ありがとうございます。 確かにそうですよね。typedefを用いているのでstructのほうは不要になりますよね。 ありがとうございました。
お礼
回答ありがとうございます。 教えていただいて、どう訂正すべきかということがわかりました。 実態を作ってやればいいんですね。 ありがあとうございました。