ホームページ > バックエンド開発 > C++ > `reinterpret_cast` による非配列ポインタのポインタ演算は未定義の動作ですか?

`reinterpret_cast` による非配列ポインタのポインタ演算は未定義の動作ですか?

Patricia Arquette
リリース: 2024-11-08 15:12:01
オリジナル
1144 人が閲覧しました

Is Pointer Arithmetic on Non-Array Pointers with `reinterpret_cast` Undefined Behavior?

配列以外のポインターを使用したポインター演算は未定義の動作ですか?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート