以下のプログラムはどのようにコンパイルされますか?
int main()
{
int *ptr = NULL;
int &ref = *ptr;
return 0;
}
ideoneでご覧ください。
NULL への参照を定義できますか?
以下のプログラムはどのようにコンパイルされますか?
int main()
{
int *ptr = NULL;
int &ref = *ptr;
return 0;
}
ideoneでご覧ください。
NULL への参照を定義できますか?
コンパイラはコンパイル時にポインタの値をチェックしないため、指定したコードはコンパイルされます。ただし、NULLポインターの逆参照は、未定義の動作です。
これは私が過去に一度遭遇し、私の記憶に焼き付いた問題です。私のさらなる考えはここで見つけることができます:https ://stackoverflow.com/a/57656/5987
C ++ FAQから引用:
C++標準で定義されているC++言語は、違法であると言っています。それはそれを違法にします。C ++標準では、この特定のエラーの診断は必要ありません。つまり、特定のコンパイラは、pがNULLであることを認識したり、エラーメッセージを表示したりする必要はありませんが、それでも違法です。また、C ++言語では、実行時に爆発するコードをコンパイラーが生成する必要はありません。
nullポインタを逆参照します。あなたのコンパイラは、そのような不正な形式のプログラムに文句を言うことを義務付けられていません。ただし、これを実行したときに悪いことが何も起こらないことを意味するものではありません。
C ++ 03 8.3.2/4から:
注:特に、null参照を作成する唯一の方法は、nullポインターを逆参照して取得した「オブジェクト」にバインドすることであり、未定義の動作が発生するため、null参照は明確に定義されたプログラムに存在できません。
いいえ、ptr はアドレスを持つポインタです。そのポインターを null に設定します。したがって、そのポインターの値は null です。ただし、ポインター自体にはアドレスがあります。参照は、その値ではなく、ポインターのアドレスに設定されています。
NULL 自体への参照 - これは失敗します。例えば:
int &ref = &NULL; // fail