C文字列にアクセスすると、ヌル終了文字自体がになります。は未定義の動作です。しかし、我々はがのように未定義の振る舞いをもたらしますが、まったく別の理由があります:
文字列のために予約されたchar配列の最後の位置に終端ヌル文字が存在する場合、終わりを越えて文字列にアクセスすると、その境界から外れます。そして、この範囲外のアクセスが...本当に未定義の動作を生成するものです
編集:
[余談:?であることUB]
UB、未定義の動作、意味のある行動がないので、定義できない動作です。未定義の動作に依存すると、期待される結果を得ることを含む何らかの結果が生じることがあるが、他の時間(例えば、コンパイラのバージョンを切り替えた後、単に再コンパイルした後、ただ1つの同じプログラムを再起動した後であっても)。したがって、未定義の動作に依存するプログラムは、明確に定義されていないとみなされます。
例:すでに削除されているオブジェクト(「ダングリングポインター」)を指すポインターを間接的に参照するか、疑問点に近づいています。範囲外の配列にアクセスします。 (悪い!!!)は、与えられたアドレスにあるまったく異なるオブジェクトのメモリを上書きします(プログラムが実行されるたびに同じオブジェクトである必要はありません1つのプログラム実行でも実行されません)。
未定義の動作は、それコンパイラのベンダーに委ねられ、一定の合理的な制限内で動作を定義します。
例:負の整数の右シフト - 符号拡張の有無にかかわらず発生する可能性があります(したがって、算術演算または論理シフトが可能です)。どちらが当てはまるかは標準では規定されていませんが、負の整数で右シフトを使用することはよく定義されています。
いいえ、メモリが割り当てられ、UBが存在しません。 – user0042
これは、 'sizeof'が文字列の長さではなく配列のサイズを返すという点を除いては問題ありません。 –