質問: 0x636261)で初期化しており、6.4.5 の規定にそぐわない様に思われるのですが......。
回答: C99 6.4.5 p5 には、文字列リテラルが静的記憶期間を持つ領域を初期化するのに使われるとの規定がありますが、いつ初期化されるかは定められていません。 つまり、そのリテラルが出現した時に静的領域を初期化する必要はありません。例えば、ELF 形式では、プログラムのロード時、プログラムがメモリに展開される際に行われるようになっていると思います。 また、配列変数の初期化についても、その静的領域を参照しなければならない旨はどこにも記述されていません。 そこで、今回のコードについては、以下のように解釈できます。 1. `"abc"` は、6.4.5 p5 の規定に従い、`'a'`、`'b'`、`'c'`、`'\0'` からなる `char[4]` 型のリテラルとして解釈される。そして、質問文に引用されている部分の規定により、このリテラルは静的記憶期間を持つ領域をこれで初期化することになる。 2. `char str[] = "abc"` は、1 で書いた通リの値を持つので、 6.7.8 p14 の規定通り、 `str` が長さ4で、各要素の値が `'a'`、`'b'`、`'c'`、`'\0'` となるように初期化される。この実行において、 **1で確保された静的記憶領域を全く参照する必要はない** ため、定数で一気に初期化を行った。 3. さらに、1 で静的記憶期間を持つとしたものの、それがどこからも参照されていない。そのため、最適化としてそのような領域は削られることになった。 3 については、 gcc で最適化を無効にしても削られているので不審に思われるかもしれませんが、実のところこういったことはままあります。 例えば、何もしない文 `"def";` などというものを関数内の適当なところに置いたところで、`"def"` に相当する領域はどこにも確保されません。 文字列から離れてみれば、定数10で割る演算は、除算命令に頼らない方法に展開されます。 こういったものは非常に基本的な部分に組込まれていて、最適化を無効化しても適用されるようになっているのだと思います。