無効なポインターの保存は常に未定義の動作になりますか?
C および C では、無効なポインターを逆参照すると、未定義の動作が発生します。しかし、疑問が生じます: 単に無効なメモリ アドレスをポインタ変数に格納することは、未定義の動作になりますか?
次のコードを考えてください:
<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 ではポインタ演算を定義していますが、オペランドが無効なメモリ アドレスを指している場合は明示的にカバーされていません。
したがって、C 標準では省略により、このケースは未指定のままになっています。未定義の動作をレンダリングします。したがって、無効なポインタをポインタ変数に格納することは、たとえ逆参照されていなくても、現在の標準に従って C および C では未定義の動作とみなされます。
以上が## 無効なポインタを格納すると、C/C では常に未定義の動作になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。