配列以外のポインターを使用したポインター演算は未定義の動作ですか?
C 標準では、整数式をポインターに加算または減算すると結果が得られると指定されています同じ型のポインタ内。ただし、ポインタが元々配列内の要素を指している場合、結果のポインタも配列内の有効な要素を指している必要があります。ここで疑問が生じます。実際には文字配列を指していない「char *」ポインタに追加するのは未定義の動作 (UB) なのでしょうか?
次のコードを考えてみましょう:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
行 () は、reinterpret_cast を実行して f のアドレスを「char 」ポインターに変換し、そのオフセットを追加します。 zメンバー。結果のポインタ p は、f.z.
の値を変更するために使用されます。標準によれば、p は文字配列を指していないため、この行の結果は UB になります。ただし、オブジェクトの基になるメモリ表現を操作するためにそのようなポインタを使用することは許容されると一般的に想定されています。
標準では、これが UB であるとは明示的に述べられていませんが、自明にコピー可能な型のオブジェクトがコピーできることを要求しています。 char または unsigned char の配列にコピーできます。これは、オブジェクトを構成する生のバイトへのポインタに対してポインタ演算を定義して、上記の操作を可能にする必要があることを示唆しています。
したがって、「char *」ポインタに追加することは、基になるバイトを配列にコピーすることが意図されているシナリオでは、文字配列を指す 't は UB ではありません。
以上が`reinterpret_cast` による非配列ポインタのポインタ演算は未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。