アプリ版:「スタンプのみでお礼する」機能のリリースについて

構造体の静的な初期化で、初期化が書かれていないメンバーは、
どうなるのでしょうか。。?
たとえば・・・

// 構造体の宣言
strcut MY_STRUCT {
   int data1 ;
   int data2 ;
   int data3 ;
   int data4 ;
} ;

// 変数宣言&初期化
static strcut MY_STRUCT st = {
   .data1 = 100,
   .data3 = 300
} ;

ネットで調べると、
初期化で指示されていないメンバーは0に初期化される、
という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか?
それともコンパイラ依存の仕様でしょうか?

A 回答 (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/
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/01/11 14:57

ちなみに


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

えっと、ご質問の回答は#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が入ってたりしませんか?
    • good
    • 0

★規格上で初期化されます。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!