- ベストアンサー
構造体の静的な初期化とは?
- 構造体の静的な初期化で初期化が書かれていないメンバーは、C言語(C99)の仕様では0に初期化されます。
- ネットで調べると、初期化で指示されていないメンバーは0に初期化される、という記述もあります。
- 構造体の静的な初期化は、コンパイラによらずC言語の仕様であり、安定した動作が期待できます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2, #3 の方、この初期化の方法は C99で導入されたもので gcc固有の拡張ではありません。 単にVC++などがC99の規格を満たしていないだけです。 質問者さんへ。 どうせネットで探すのなら原規格をあたるべきでしょう。 こういうところで訊いても所詮二次情報なので、 (わたしも含め)回答者が勘違いしていたり 無知のために 間違った回答をすることが少なくありません。 C99 は JIS規格 X 3010 になっていますので、 ネット上でpdfのものを参照することができます(ただし、保存も 印刷もできません。規格書を買えば別ですが)。 とりあえず今回の質問に関連するところを抜き出して引用します。 X 3010 6.7.8 初期化 要素指示子が .識別子 という形式の場合、現オブジェクトは構造体型または共用体型をもち、 識別子はその型のメンバ名でなければならない。 意味規則 自動記憶域期間をもつオブジェクトを明示的に初期化しない場合、 その値は不定とする。 静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、 次の規定に従う。 a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。 b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。 c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に) 適用し初期化する。 d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を (再帰的に)適用し初期化する。 原文を読みたいのであれば、 日本工業標準調査会のページ http://www.jisc.go.jp/ にアクセスし、ウィンドウの右の方にある 「JIS 検索」のリンクをクリックして 該当の規格を検索してください。 今回は規格番号がわかっているので、 一番上の 「JIS規格番号からJISを検索」で テキストボックスに X3010を入力して検索すれば 一発ででます。 pdfファイルへのリンクは毎回変わるので直接示すことができません。 面倒ですが検索からやってください。
- 参考URL:
- http://www.jisc.go.jp/
その他の回答 (3)
- i-kujou
- ベストアンサー率50% (13/26)
ちなみに static strcut MY_STRUCT st = { .data1 = 100, .data3 = 300 } ; という初期化形式は gcc の拡張構文だったはずです。 Windows系のコンパイラ(VisualC++やIntelC、BCC)ではコンパイルがとおりません。
- FAY
- ベストアンサー率49% (95/193)
えっと、ご質問の回答は#1さんが示されている通りです。 そのほかにちょっと気になったことが。 > static strcut MY_STRUCT st = { > .data1 = 100, > .data3 = 300 > } ; これ、正しく初期化できますか? (そもそもコンパイルが通らない気もしますけど、仮に通ったことにしましょう) printf("%d, %d, %d, %d\n", st.data1, st.data2, st.data3, st.data4); とかするとdata1に100が、data2に300が入ってたりしませんか?
- Oh-Orange
- ベストアンサー率63% (854/1345)
★規格上で初期化されます。 ・コンパイラ依存の仕様ではありません。 ・あと『変数宣言&初期化』ではなく『変数定義&初期化』ですよ。 ・『宣言』と『定義』の区別をつけましょう。 ・ネットで調べたとおり、初期化の指示がないメンバーは 0 に初期化されます。 ・どれも指示がなければ、すべてのメンバーが 0 に初期化されます。 ・以上。おわり。
お礼
なるほど! 動的変数では明示的に初期化しなかったメンバは不定、 静的変数ではNULLか0に初期化される、ということなのですね。 CにJIS規格があるとは、知りませんでした。 原本をあたってみようと思います。 ありがとうございました!