• ベストアンサー

構造体のポインタ参照

構造体のプログラムを作成しており、コンパイルを行った際にエラーが起きてしまいました。 以下に構造体宣言とメイン関数のプログラムをとエラーが出てしまった部分を記述します。 エラー表示の内容として「不完全型ポインタへの間接参照」と出ました。 自分なりに考えた結果、ポインタの参照部分に間違いがあるためエラーが起こったと思います。そのエラーが生じた部分のプログラムをどのように修正すればコンパイルが成功するか、ご教授のほうお願いします。 /* 構造体宣言 */ 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; }

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

  • ベストアンサー
  • lawson
  • ベストアンサー率44% (29/65)
回答No.1

エラーメッセージが見てないからなんともいえませんが・・・。変だなぁと思う点。 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についてはなにも言えません。 以上。

kaiji12345
質問者

お礼

回答ありがとうございます。 教えていただいて、どう訂正すべきかということがわかりました。 実態を作ってやればいいんですね。 ありがあとうございました。

その他の回答 (1)

回答No.2

実行時に問題が出る場面は、 No.1 で指摘のあるとおりです。 でも、コンパイルが通らないというのは、 struct PREDICTOR *pred; に sturuct があるからではないでしょうか? 構造体を PREDICTOR に typedef しているので、ここには、struct は不要です。 (でも、だったら、PREDICTOR の定義に関してエラーが出るはずですが)

kaiji12345
質問者

お礼

回答ありがとうございます。 確かにそうですよね。typedefを用いているのでstructのほうは不要になりますよね。 ありがとうございました。

関連するQ&A