• ベストアンサー

構造体の宣言

下記のように構造体の宣言をした所、 struct B_PARAM test; 「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。 ヘッダファイルに構造体の形は定義してあるのですが、 構造体の中に構造体があるからでしょうか? またこの構造体を正しく宣言するにはどうすればいいのでしょうか?

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

  • ベストアンサー
回答No.3

typedef struct _B_PARAM { char p1; char p2[2]; } B_PARAM; の、_B_PARAM は、構造体の「タグ名」です。 これは、sutruct とともに使う名前です(C++ struct 無しでもOK) ですから、この例では、struct _B_PARAM で正解です。 後ろの、B_PARAM は、typedef した名前です。 おおざっぱに言えば、 struct _B_PARAM { char p1; char p2[2]; } という構造体を、B_PARAM という名前で読み替えることを宣言しています。 ですから、こちらを使うのであれば、struct 無しの B_PARAM test; で正解です。 構造体は必ず typedef しなければならないというものではありません。

take_july
質問者

お礼

なるほど!ちょっと勘違いしてました。 理解できました。ありがとうございました。

その他の回答 (2)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

B_PARAMの宣言が 例えば int a[] なんかになっていたりしませんか? 配列要素数が確定していないと、駄目なんですよ~ それと、使ったコンパイラを書きましょう。 このエラーだと、多分gccだとは思いますが。

take_july
質問者

補足

すいません、linuxでgccを使っています。 gcc -v とやってみたら gcc バージョン 3.2.3 20030502 (Red Hat Linux 3.2.3-20) とでました。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

B_PARAM の宣言内容はどんな感じなんでしょうか?

take_july
質問者

補足

typedef struct _B_PARAM { char p1; char p2[2]; } B_PARAM; とりあえず中の項目を絞って上のようにしても、 同じエラーが出ていたので、どうしてだろう? と思っていたのですが、 struct _B_PARAM test1; test1.p1 = 'F'; printf("%c", test1.p1); とする事で正しく扱えました。 まだ良く理解できてないのですが、{}の後につく名前と前につく名前は 何が違うのでしょうか? B_PARAM *test2; test2->p1 = 'D' ; printf("%c", test2->p1); とする事でも出力は出来ましたが、{}の前の名前は構造体用 後の名前はポインタ用とかあるのでしょうか? 追加質問で申し訳ありません。

関連するQ&A