C でよくある混乱のポイントは、初期化されていないポインターの逆参照がいつ未定義の動作 (UB) になるかを理解することです。 C 標準には多数のルールが含まれていますが、この動作を定義する正確な規定を見つけるのは難しい場合があります。
問題のコード スニペット:
int* ptr; *ptr = 0;
では、ptr を逆参照するかどうかという疑問が生じます。 UBにつながります。これを明確にするために、C 標準の関連セクションを詳しく調べます。
標準のセクション 4.1 は、重要な洞察を提供します。
「左辺値が参照するオブジェクトが T 型のオブジェクトでも、T から派生した型のオブジェクトでもない場合、またはオブジェクトが初期化されていない場合、これを必要とするプログラム変換には未定義の動作があります。"
この場合、ptr は整数への初期化されていないポインタです。したがって、最初に初期化せずに逆参照しようとすると、セクション 4.1 で説明されている条件に該当し、UB が発生します。
セクション 3.7.3.2/4 は、UB に関連してよく引用されますが、コードには直接適用されません。問題のスニペットは、null 以外のポインターでの割り当て解除関数の使用に関連しているためです。
標準で「uninitial」を検索すると、8.5.1 などの他の関連セクションが表示され、初期化されていないオブジェクトにアクセスするためのルールがさらに明確になります。
以上がC での初期化されていないポインタの逆参照は未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。