Adding to a "char *" Pointer: UB or Not?
C 17 は、ポインタに整数式を追加するための規則を定義し、次のように述べています。結果が指す配列の境界を超えると、未定義の動作が発生します。ただし、この定義は、配列の要素を指すポインターに特に関係します。
次のコード スニペットを考えてみましょう。
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
行 (*) が未定義の動作をトリガーするかどうかという疑問が生じます。 float へのアドレスを char ポインタとして再解釈しても、それは char 配列を指しません。したがって、引用された定義によれば、これは未定義の動作であるように見えます。しかし、その場合、offsetof マクロの有用性は大きく損なわれることになります。
ただし、C では、簡単にコピー可能な型の基礎となるバイトを文字配列にコピーすることもできます。この操作は、std::memcpy などの関数を使用するか、バイトごとに手動で実行できますが、元のオブジェクトが配列である必要はありません。
したがって、これらのバイト単位の操作を成功させるには、ポインターへの整数式の追加は、オブジェクトの生のバイトを指すポインターに対して定義する必要があります。これらのバイトが暗黙的に配列を形成するのか、それとも一般的な加算規則に対する特別な例外を構成するのかは不明です。それにもかかわらず、どちらの解釈でも、提供されたコード例の追加の正当性が正当化されます。したがって、このコンテキストで「char *」ポインターに追加しても、未定義の動作は発生しません。
以上が配列を指していない場合、「char *」ポインタに追加すると未定義の動作になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。