ホームページ  >  記事  >  バックエンド開発  >  C の非文字配列でのポインタ演算は動作を定義されていますか?

C の非文字配列でのポインタ演算は動作を定義されていますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-09 09:59:02913ブラウズ

Is Pointer Arithmetic on Non-Character Arrays in C   Defined Behavior?

非文字配列でのポインター演算

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。