
[code]

    #include < stdio.h>
    int main(void){
        char str[3];
        str[0] = 'a';
        str[1] = 'b';
        str[2] = 'c';
        printf("%s\n", str);
        return 0;
    }
    
[/code]

実行結果  
abc

このコードはchar型配列str[3]を宣言し、str[0]に'a'を、[1]に'b'  
を、[2]に'c'を格納しています。  
しかし、この文字列strには終端'\0'が存在しないので、正しい実行結果は得られないはずなのですが、このコードは abc
を返しました。このプログラムはいかにして文字列の終端を読み取ったのでしょうか？


CC BY-SA 3.0
2015-05-05T13:30:37.743
9841
2015-05-06T05:12:38.877
2015-05-05T15:04:45.257
8870
9616
question
c
終端文字を設定しない文字配列の使用について


たまたま配列の後に'\0'に等しい値が入っていたので終端と判断されただけです。  
試しにこのコードを実行してみればわかると思います。

[code]

    printf("%d\n", str[3]);
    
[/code]


CC BY-SA 3.0
2015-05-05T14:03:44.810
9842
2015-05-05T14:03:44.810
3639
9841
answer


「正しい実行結果は得られないはず」という期待が間違っています。件のコードは未定義動作を引き起こすものであり、その結果クラッシュしても、たまたま「abc」と表示されても、[鼻から悪魔](http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html#Q3)が出てきても、何が起こってもおかしくありません。

一般的に、何が未定義動作かを知ることは(それを避けるために)重要ですが、未定義動作の挙動についてその理由を突き詰めることはさして意味を持ちません。


CC BY-SA 3.0
2015-05-05T14:37:20.427
9843
2015-05-06T05:12:38.877
2015-05-06T05:12:38.877
4765
4765
9841
answer


コンパイラの最適化処理で配列が調整されたとか。

うちで試してみたところ、最適化なしだと「abcL」、最適化あり(-O3)だと「abc」となりました。


CC BY-SA 3.0
2015-05-05T15:13:00.057
9844
2015-05-05T15:13:00.057
5203
9841
answer