無効なアドレスによるポインタ演算は常に未定義の動作ですか?
ポインタ演算は C および C の基本的な演算であり、プログラマがメモリを操作できるようになります。データ構造をアドレス指定してナビゲートします。ただし、無効なアドレスでのポインタ演算の動作は必ずしも明確ではありません。
ポインタに無効なアドレスを保存する: 未定義か未定義ですか?
次のスニペットを考えてみましょう。定数を減算してポインタの有効性をテストするには:
<code class="c">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
この例では、式 begin - 1 は無効なメモリ アドレスになります。問題は、このアドレスをポインタ変数に格納するという単なる行為が未定義の動作を始めるのかということです?
標準のあいまいさ
C および C 標準では、明示的には定義されていません。このシナリオに対処します。セクション 6.5.6/8 ではポインタ算術演算を定義していますが、無効なアドレスの場合は扱っていません。
ただし、有効な配列境界内でのポインタ算術演算の動作と、配列の 1 つ先の要素を指すポインタの動作については定義しています。配列の終わり。これらの条件はどちらも上記の例には当てはまりません。
アーキテクチャ固有の未定義の動作の可能性
一部のアーキテクチャでは、例外 (バス エラーなど) が発生する可能性のあるメモリ保護メカニズムが実装されています。 ) 無効なメモリアドレスにアクセスした場合。このような場合、無効なポインタをレジスタに格納することは、確かに未定義の動作とみなされる可能性があります。
結論
C および C 標準では、無効なポインタを格納するかどうかについて明確な答えはありません。ポインタ変数内のアドレスは未定義の動作になります。ただし、特定のアーキテクチャでは、メモリ保護メカニズムが原因で、そのようなシナリオで未定義の動作が発生する可能性があります。このような行為を避け、適切なポインター検証手法を利用して未定義の動作を防ぐことが最善です。
以上がポインタ変数に無効なアドレスを格納すると、C および C では常に未定義の動作になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。