非文字配列でのポインター演算
C では、配列またはポイントを参照するポインターに対するポインター演算の動作が明確に定義されています。配列の先頭に。ただし、文字配列を直接ポイントしていないポインターにポインター演算を適用すると、疑問が生じます。
次のコード スニペットを考えてみましょう。
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z);
(*) でマークされた問題のある行Foo 構造体の z メンバーのアドレスを p ポインターに割り当てます。標準 (expr.add/4) によれば、p が char 配列を指していないため、この操作は未定義動作 (UB) と見なされる可能性があります。
ただし、標準では、任意の配列の基になるバイトが自明にコピー可能なオブジェクトは、char または unsigned char の配列にコピーできます。これは、配列を形成するかどうかに関係なく、オブジェクトを構成する生のバイトへのポインターに対してポインター演算が有効である必要があることを意味します。
この特定のケースでは、コードの背後にある目的は、z メンバーにアクセスすることです。 reinterpret_cast を使用します。標準では、このようなシナリオでポインター演算が定義されていることは明示的に規定されていませんが、定義されていない場合、offsetof の有用性が大幅に制限されることになります。
したがって、行 (*) の追加は 有効であると見なされます。 C の 。 p でのポインター演算が許可されており、Foo 構造体の z メンバーを正しく指します。
以上がC の非文字配列でのポインタ演算は動作を定義されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。