参照を取得するために NULL ポインターを逆参照できますか?
C 標準では、NULL ポインターの逆参照を未定義の動作として定義しています。ただし、次のような参照を取得するための NULL ポインター逆参照を伴うコード スニペットでは、疑問が生じます。
int* ptr = NULL; int& ref = *ptr; int* ptr2 = &ref;
標準定義:
C 標準による(8.3.2/4「参照」)、明確に定義されたプログラム内に null 参照は存在できません。これは、そのような参照を作成するには、null ポインターを逆参照して取得した「オブジェクト」にバインドする必要があり、未定義の動作となるためです。
実装の詳細または適切に定義されていますか?
実際には、提供されたコード スニペットにより、ptr2 が NULL に設定されます。ただし、これは実装の詳細にすぎません。標準では、null ポインターの逆参照は未定義であると明示的に規定されています。
NULL ポインターの逆参照の影響:
一般に、null ポインターの逆参照はクラッシュにつながります。参照を取得するためにそれを使用する特定のケースでは、コンパイラーは参照をポインターとして実装し、実際の逆参照操作を排除します。それにもかかわらず、基本的な未定義の動作は残ります。
例外: sizeof 演算子
明確に定義された方法で null ポインターを逆参照する場合の例外は、sizeof 演算子です。 sizeof を使用する場合、オペランドは評価されず、逆参照操作が回避されます。
以上がNULL ポインタを逆参照して参照を取得することは C で適切に定義できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。