2009-08-08 57 views
0

我不確定我對C++的理解是否是錯誤的。我讀過1)所有非零值相當於TRUE,零相當於FALSE; 2)空指針被存儲爲零。C++零(空)指針應該返回false嗎?

然而,這樣的代碼:

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

給我提領,從一個空指針段錯誤,但

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

工作正常。任何想法爲什麼?

+3

只需在旁邊註釋,空指針不需要在硬件中表示爲零,但編譯器將這種複雜因素考慮在內。 – 2009-08-08 07:36:11

回答

8

對於指針,p(p != 0)是完全等效的。如果它給你一個段錯誤,那麼要麼它不是一個普通的指針,要麼是其他地方的問題

+0

是的,我認爲你是對的。在修改代碼的其他部分之後,我的問題似乎消失了。儘管不太清楚它是如何發生的。 – int3 2009-08-08 07:36:32

+0

編譯器代碼生成錯誤?或者segfault真的是其他地方? – pjc50 2009-11-03 13:46:30

1

C++ 0指針不一定被存儲爲全零位模式,但是令牌0總是被解釋爲0指針if編譯器認爲它是一個指針,如果編譯器認爲它是一個需要進行類型轉換的整數,則整數0總是強制爲0指針(可能具有不同的位模式)。指向不同事物的指針可以具有不同的sizeof,它也可以是與整數不同的sizeof。但是你可以看到它是如何工作的。通常。明確?

+0

這麼多泥水,值得刪除。你所說的話可能在技術上是真實的,但是你從原來的問題來解釋它很糟糕,它會讓新人感到困惑。重新分解或刪除。 – 2009-08-08 18:07:51

+1

整數0並不總是強制爲空指針。例如,'int n = 0; void * p =(void *)n;'是U.B.,特別是不需要使'p'成爲空指針。如上所述,只有一個整型立即數0才能被視爲一個空指針。 – 2009-08-09 04:29:33

+0

他指的是,我認爲,'指向類的成員'類型,有奇怪的0比較。 – 2013-03-11 06:04:05