ホームページ >バックエンド開発 >C++ >C で参照定義の動作を取得するために NULL ポインターを逆参照することはできますか?

C で参照定義の動作を取得するために NULL ポインターを逆参照することはできますか?

DDD
DDDオリジナル
2024-12-07 06:59:12241ブラウズ

Is Dereferencing a NULL Pointer to Obtain a Reference Defined Behavior in C  ?

参照のための NULL ポインターの逆参照: 解釈と標準

C では、次のコードは標準が何を規定しているかという疑問を引き起こします。

int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;

具体的には、NULL ポインターの逆参照は許可されていますか?

標準解釈

C 標準によれば、NULL ポインタの逆参照は未定義の動作とみなされます。これは、標準のセクション 8.3.2/4 で明示的に述べられています。

注: 特に、null 参照は、明確に定義されたプログラム内に存在できません。そのような参照を作成する唯一の方法は次のとおりです。 null ポインタを逆参照することで得られた「オブジェクト」にバインドすると、未定義の動作が発生します。

実装影響

ただし、実際には、多くのコンパイラは、結果を NULL に設定するようにこの動作を実装しています。これは、提供されたコード スニペットの ptr2 に NULL の値が割り当てられることを意味します。

コンパイラ解釈

上記の動作は、によって保証されていないことに注意することが重要です。これは標準であり、コンパイラやプラットフォームによって異なる場合があります。たとえば、一部のコンパイラは、NULL ポインターを参照解除するときに例外を発生させたり、他のプラットフォーム固有のアクションを実行したりする場合があります。

特定の例外

このルールの 1 つの例外は、次の使用です。 NULL ポインターの sizeof 演算子の。このコンテキストでは、逆参照は実際には発生せず、sizeof を使用して、未定義の動作を引き起こすことなく型のサイズを決定できます。

以上がC で参照定義の動作を取得するために NULL ポインターを逆参照することはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。