非配列データ構造でのポインタ演算は未定義の動作ですか?
この疑問は、ポインタに関する C 17 標準間の明らかな矛盾から生じます。 offsetof マクロの追加と機能。引用された段落によると、「char 」ポインタに追加すると、それが char 配列を指していない場合、未定義の動作が発生するはずです。ただし、提供されているコード例には、「Foo」構造体のアドレスを reinterpret_casting して取得した「char 」ポインタに追加することが含まれています。ポインタが char 配列を指していないため、これはルールに従っていないように見えます。
しかし、標準をさらに詳しく調べると、セクション 3.9.2 に次のようなガイダンスが見つかります。 (基本クラスのサブオブジェクトを除く) 自明にコピー可能な型 T の場合、オブジェクトが型 T の有効な値を保持しているかどうかに関係なく、オブジェクトを構成する基礎となるバイトを char または unsigned の配列にコピーできます。 char."
このステートメントは、配列を表すかどうかに関係なく、標準ではオブジェクトの基になるバイトをコピー可能とみなしていることを示唆しています。これは、ポインターが配列を指していなくても、コード内で実行している加算が有効である必要があることを意味します。加算は生のバイトで定義され、その結果の値は、「Foo」構造体の目的の float メンバーにアクセスするために使用されます。
したがって、提供されたコード例の加算演算は未定義の動作ではありません。 reinterpret_casting と offsetof を使用して、構造体のメンバーを表すバイトにアクセスして変更することができます。
以上が非配列データ構造でのポインタ演算は C で定義されていますか、それとも未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。