ホームページ > バックエンド開発 > C++ > C 17 で文字配列を指していない場合のポインタの追加は未定義ですか?

C 17 で文字配列を指していない場合のポインタの追加は未定義ですか?

Linda Hamilton
リリース: 2024-11-11 11:48:03
オリジナル
524 人が閲覧しました

Is Pointer Addition Undefined When Not Pointing to a Character Array in C  17?

Char 配列を指していない場合、ポインタの追加は未定義ですか?

C 17 標準では、整数値をポインタに追加すると、オペランドと同じ型のポインタであり、演算がその範囲内にとどまる場合、結果は配列内の (仮想の) 要素を指します。ただし、これが char 配列をポイントしていないポインタに適用されるかどうかは不明のままです。

次のコードを考えてみましょう:

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float *>(p) = 42.0f;
ログイン後にコピー

(*) でマークされた行は未定義の動作を構成しますか ( UB)?ポインタ p は文字配列ではなく浮動小数点数を指します。引用された段落によると、これにより UB が発生するはずです。ただし、UB だった場合、offsetof() の有用性は大幅に制限されます。

標準の簡単にコピー可能な型の定義では、基になるバイトは std::memcpy のような関数を使用して char 配列にコピーできると記載されています。 。これは、結果が配列にバイトをコピーするために使用されるかどうかに関係なく、オブジェクトを構成する生のバイトへのポインタに対して加算を定義する必要があることを意味します。

関係するバイトが既に配列を形成していることを意味するかどうかまたは、オペレータの通常のルールに対する特別な例外を構成するかは不明瞭です。ただし、どちらの解釈でもコード内の追加は有効になります。したがって、たとえそれが char 配列を指していなかったとしても、char * ポインターへの追加は必ずしも UB になるわけではないと結論付けることができます。

以上がC 17 で文字配列を指していない場合のポインタの追加は未定義ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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