• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体の静的な初期化)

構造体の静的な初期化とは?

このQ&Aのポイント
  • 構造体の静的な初期化で初期化が書かれていないメンバーは、C言語(C99)の仕様では0に初期化されます。
  • ネットで調べると、初期化で指示されていないメンバーは0に初期化される、という記述もあります。
  • 構造体の静的な初期化は、コンパイラによらずC言語の仕様であり、安定した動作が期待できます。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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/
noname#43437
質問者

お礼

なるほど! 動的変数では明示的に初期化しなかったメンバは不定、 静的変数ではNULLか0に初期化される、ということなのですね。 CにJIS規格があるとは、知りませんでした。 原本をあたってみようと思います。 ありがとうございました!

その他の回答 (3)

  • i-kujou
  • ベストアンサー率50% (13/26)
回答No.3

ちなみに static strcut MY_STRUCT st = {    .data1 = 100,    .data3 = 300 } ; という初期化形式は gcc の拡張構文だったはずです。 Windows系のコンパイラ(VisualC++やIntelC、BCC)ではコンパイルがとおりません。

  • FAY
  • ベストアンサー率49% (95/193)
回答No.2

えっと、ご質問の回答は#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)
回答No.1

★規格上で初期化されます。 ・コンパイラ依存の仕様ではありません。 ・あと『変数宣言&初期化』ではなく『変数定義&初期化』ですよ。 ・『宣言』と『定義』の区別をつけましょう。 ・ネットで調べたとおり、初期化の指示がないメンバーは 0 に初期化されます。 ・どれも指示がなければ、すべてのメンバーが 0 に初期化されます。 ・以上。おわり。

関連するQ&A