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