2016-09-21 21 views
3

次のスニペットはif文のブロックをコンパイル/実行しますか?NULLポインタの逆参照もNULLと等しいですか?

int* pointer = NULL; 
int deref = *pointer; 
if(deref == NULL){ 
    // will execute? 
} 

pointer変数は、このポインタ変数の間接参照もNULLを返すんNULL含まれていたりするので、実行時エラーでこの結果だろうか?

+1

inは逆参照できません –

+1

@LưuμĩhhhhhcISO C標準では、NULLポインタの逆参照に「発生できません」などの要件はありません。これは未定義の動作であり、実際にはいくつかの環境で実行でき、文書化された言語拡張として提供することもできます(あまりよく考慮されていませんが、明らかに)。 – Kaz

+0

歴史的に、Cプログラマは、リンク解除されたリストまたはツリーデータ構造のケースを単純化するために、逆参照可能なヌルポインタを利用しました。 'nead_node-> next'が終端のヌルリンクであることを心配することなく' head_node-> next-> prev = that'のようなことをすることができます。明らかに、そのコードはヌル参照をトラップする環境への移植性がないことが判明しました。それは間違っていませんでした。元のターゲットプラットフォームで正常に動作し、コードは幸せなエンドユーザーに出荷されました。それは**不可能**でした。 – Kaz

答えて

3

結果は「未定義の動作」であり、実行時エラーを引き起こすかどうかは問わず、常に回避する必要があります。

1

現在の回答がUBに非常によく対処しました。しかし、私は何かを追加したい。このコードを実行すると、が出力されます。したがって、特定の環境でヌルポインタを参照解除すると、0(これはUB)が返され、if文内の部分が実行されます。

なぜ私はそれがいくつかのマシンで動作しているかを明確にしたかっただけです。しかし、それがUBであるという事実については何も変わりません。

+0

あなたの例が_dereference_ 'NULL'をしていないことを指摘してください。しかし、次の段落はそれについて話します。あなたの意図は何でしたか? –

+0

@JohannGerell私は彼のコードがいくつかのマシンで動作し、if文の中で命令を実行することをOPに知らせたいと思っていました。この動作はまだ定義されていませんが、一部のコーダーは、それが動作し、意図したように動作しているため定義されていると考えるかもしれません。だから、私はそれを伝える価値があると思う。 –

+0

ここで扱っているのは、あなたの例 'の'(0 == NULL) 'の中の '0'が、何らかのプラットフォームでヌルポインタを逆参照した結果なのです。私はあなたがこれを策定した方法によって混乱しました。 –

2

あなたが設定したら:

int* pointer = NULL; 

ポインタポイントを何にも。あなたが書いたときに今、この:

int deref = *pointer; 

DEREFは、セグメンテーション違反などの未定義の動作につながる、と何のポインタポイントにアクセスしようとします。

私はこれが説明することを望みます。

関連する問題