2009-08-08 8 views
0

C++の理解が間違っているかどうかはわかりません。私はそれを読んだことがあります.1)ゼロ以外の値はすべてTRUEと等しく、ゼロはFALSEと等価です。 2)ヌルポインタはゼロとして格納されます。C++のゼロ(NULL)ポインタはfalseを返すはずですか?

しかし、このようなコード:

void ViewCell::swapTiles (ViewCell *vc) { 
    ViewTile *tmp = vc->tile(); 
    [stuff ...] 
    if (tmp) addTile(tmp); 
} 

は私にNULLポインタを参照解除するからセグメンテーション違反を与えるが、

if (tmp != 0) addTile(tmp); 

が正常に動作します。どんな考え?

+3

ハードウェアのヌルポインターをゼロとして表す必要はありませんが、コンパイラーはこの問題を取り除きます。 –

答えて

8

ポインタの場合、p(p != 0)はまったく同じです。もしそれがあなたにセグメンテーションを与えるならば、それは普通のポインタではないか、問題は他の場所にあります。

+0

ええ、私はあなたが正しいと思います。コードの他の部分を修正した後、私の問題はなくなったようです。しかし、それが最初にどのように起こったかについてはあまり確かではありません。 – int3

+0

コンパイラコード生成のバグ?あるいは、セグメンテーションは本当にどこか別のものでしたか? – pjc50

1

C++ 0ポインターは必ずしもすべてゼロビットパターンとして記憶されませんが、トークン0は常に0ポインターとして解釈されますコンパイラはそのポインタをポインタと見なし、型変換が必要な整数であるとコンパイラが判断した場合、整数0は常に0ポインタ(おそらく異なるビットパターンで)に強制されます。また、異なるものへのポインタはsizeofを異なるものとすることができます。これは整数とは異なるサイズにすることもできます。しかし、それがどのように機能するかを見ることができます。通常。クリア?

+0

それはあまりにも水を濁すので削除する価値がある。あなたが言うことは、技術的には真実かもしれませんが、それは新しい人にとって混乱している元の質問の点でそれをひどく説明します。再因数化または削除。 –

+1

整数0は常にNULLポインタに強制されるとは限りません。たとえば、 'int n = 0; void * p =(void *)n; 'はU.B.であり、特に' p'にヌルポインタを付ける必要はありません。記述されているように、整数リテラル0のみをヌルポインタとして扱うことができます。 –

+0

彼は、奇妙な0の比較を持つ 'クラスのメンバへのポインタ'型を参照しています。 –

関連する問題