2012-07-31 82 views
1

可能重複:
A reference can not be NULL or it can be NULL?參考爲NULL

如何以下程序編譯成功?

int main() 
{ 
    int *ptr = NULL; 
    int &ref = *ptr; 
    return 0; 
} 

請參閱ideone

我們可以定義對NULL的引用嗎?

+8

解引用空指針是UB。 – chris 2012-07-31 20:41:08

+6

首先你問它如何編譯,然後你說它應該給運行時錯誤。這些不是同一個問題。你的意思是? – Almo 2012-07-31 20:42:11

回答

6

由於編譯器在編譯時沒有檢查指針的值,因此您編寫的代碼將被編譯。但是,取消引用NULL指針是未定義的行爲。

這是我過去遇到過的一個問題,被燒成了我的記憶。我的進一步想法可以在這裏找到:https://stackoverflow.com/a/57656/5987

-3

ptr是一個指針,它有一個地址。您將該指針設置爲null。所以該指針的值爲空。但指針本身有一個地址。引用被設置爲指針的地址 - 而不是其值。

現在對NULL本身的引用 - 會失敗。

int &ref = &NULL; // fail 
+0

不,'&NULL'不能編譯。 – 2012-07-31 20:49:08

+2

Ad hominem攻擊不是必需的。問題是關於'int&ref = * ptr',它是* not *設置指針地址的引用 - 它設置引用指針指向的值,在一個情況下不存在空指針。 'int *&ref = ptr'會創建一個指針的引用。 '&NULL'不能編譯的事實與手頭的問題無關。 – 2012-07-31 21:21:32

1

您解除引用空指針。你的編譯器沒有強制要求抱怨這種格式不正確的程序。然而,這並不意味着在運行時可能會發生任何不好的事情。

從C++ 03 8.3.2/4:

注:特別是,空引用不能在良好定義的程序存在,因爲創建這樣的參考唯一 方式將是將其綁定到通過取消引用空指針獲得的「對象」,這會導致未定義的行爲。

4

the C++ FAQ摘自:

C++語言,由C++標準定義,說這是非法的;這是非法的。 C++標準不要求對這個特定錯誤進行診斷,這意味着你的特定編譯器沒有義務注意到p是NULL或給出錯誤消息,但它仍然是非法的。 C++語言也不要求編譯器生成在運行時會炸掉的代碼。