- ベストアンサー
構造体の宣言
下記のように構造体の宣言をした所、 struct B_PARAM test; 「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。 ヘッダファイルに構造体の形は定義してあるのですが、 構造体の中に構造体があるからでしょうか? またこの構造体を正しく宣言するにはどうすればいいのでしょうか?
- みんなの回答 (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 しなければならないというものではありません。
その他の回答 (2)
- PED02744
- ベストアンサー率40% (157/390)
B_PARAMの宣言が 例えば int a[] なんかになっていたりしませんか? 配列要素数が確定していないと、駄目なんですよ~ それと、使ったコンパイラを書きましょう。 このエラーだと、多分gccだとは思いますが。
補足
すいません、linuxでgccを使っています。 gcc -v とやってみたら gcc バージョン 3.2.3 20030502 (Red Hat Linux 3.2.3-20) とでました。
- trajaa
- ベストアンサー率22% (2662/11921)
B_PARAM の宣言内容はどんな感じなんでしょうか?
補足
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); とする事でも出力は出来ましたが、{}の前の名前は構造体用 後の名前はポインタ用とかあるのでしょうか? 追加質問で申し訳ありません。
お礼
なるほど!ちょっと勘違いしてました。 理解できました。ありがとうございました。