static const char [100]


main()
{
static const char a[100] = "A";
}


a[0]だけが'A'で a[1]以降は全部0で初期化されそうな感じがしますが、実際はそうならない処理系があるようです。具体的にはMacOSX.2ですが・・・(gcc version 3.3)

なお、constを取れば私が期待した通りに初期化されます。


main()
{
static const char a[100] = "A";
static const char b[100] = {'Z'};
}


とすると、bは当然100個確保されますが、aは最初の4バイトのみA\0\0\0でその次にはbの中身がみえちゃってます。

つまりa[4]でb[0]が見えるという・・

仕様的にはどっちが正しいのだろう?

コメント一覧

C は 3年以上やっていないので激しく間違っているかもしれませんが… C99 によれば、static 変数(配列なら各要素)が自動的に 0 に初期化されるのは、明示的な初期化が無い場合だそうです(以前の規格は持っていないので分からないです)。上記の場合は明示的に初期化しているので、残りの要素 a[2..99] が 0 に初期化されるとは期待できず、その内容は不定となります(「不定」なので、期待通り a[2..99] が 0 になっていても間違いではない)。さらに const がついているので、a[] のどの要素も絶対に書き換えられることはありません。したがって、a[2 .. 99] の範囲に隣の b[] の中身が偶然見えていたとしても構わないのではないかと思います。おそらくはコンパイラが記憶領域節約のためにこういう最適化をしたのではないかと推測します。
Daisuke HIGASHI

配列変数初期化で要素数不足の場合の残り要素は0 (外部,静的,自動変数の場合)と K&R(ANSI89) に書いてありました. 例示の振る舞いは本当のC89仕様では無いように見えます.
kd