無効なポインタの保存
無効なポインタの逆参照が未定義の動作につながることは十分に確立されていますが、それほど明確ではない疑問が生じます。無効なメモリ アドレスをポインタ変数に格納する行為自体は未定義の動作ですか?
次のコード スニペットを考えてみましょう:
<code class="c++">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
この例では、式 begin - 1 は次のように評価されます。無効なメモリアドレスです。ただし、アドレスは明示的に逆参照されるのではなく、その有効性を判断するためにポインター演算で使用されます。
このシナリオは未定義の動作とみなされますか?
直感的には、次のように主張する人もいるかもしれません。ポインター演算はそのような演算に依存することが多いため、そうではありません。さらに、ポインターは本質的に整数です。ただし、無効なポインタをレジスタに格納するという単なる行為であっても、潜在的なアーキテクチャ上の影響 (バス エラーなど) により未定義の動作になる可能性があると主張されています。
この問題を明確にするために、関連する C または C 標準。残念ながら、この問題は不作為により未解決のままです。 C ドラフト標準のセクション 6.5.6/8 では、ポインタが配列要素を指し、配列が十分に大きい場合、またはオペランドが最後の配列要素の 1 つ先を指す場合のポインタ演算のセマンティクスについて概説しています。上記の状況での動作は、これらの特定のケースには当てはまりません。したがって、無効なポインタを保存することは、未定義の動作を省略することによって行われます。
以上が無効なポインタ アドレスの保存は未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。