終端文字を設定しない文字配列の使用について

[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
を返しました。このプログラムはいかにして文字列の終端を読み取ったのでしょうか？




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

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

