2014-10-10 106 views
0

我正在學習C++中的指針。我寫了這個簡單的程序來展示一下我有一個問題:C++ - 空指針

#include <iostream> 

using namespace std; 

int main() { 
    cout << "test1"; 
    char *ptr = 0; 
    cout << ptr; 
    cout << "test2"; 
} 

當我運行程序時,它不輸出「測試2」結尾,而不是隻有「測試1」。這應該意味着當我試圖打印出ptr的值時它崩潰了?我嘗試在Eclipse調試器中逐步完成它,它看起來像每一行被執行,但不會拋出一個錯誤或什麼?

+0

對於初學者來說,試試這個:COUT << 「test2的」 << ENDL;看看它是否打印出test2。上一行應該打印出ptr的地址。 – 2014-10-10 01:38:41

+0

你說得對 - 對不起,我的壞語義。我不確定它是否是實現定義的。我經常在OSX和Linux上使用GCC。 – 2014-10-10 01:43:45

回答

3
char *ptr = 0; 
cout << ptr; 

還有的<<運營商,需要一個char*操作數,它假定是一個指向C風格字符串的重載。

對於除char*以外的其他指針類型,<<運算符將打印指針(它是一個地址)的值,但將null指針視爲指向C樣式的字符串會導致未定義的行爲。在任何情況下,它都不會打印指針值。

要打印指針值,你可以將其轉換爲void*

cout << "test1\n"; 
char *ptr = 0; 
cout << static_cast<void*>(ptr) << "\n"; 
cout << "test2" << "\n";; 
+0

我相信static_cast在這裏最好。 – 2014-10-10 01:47:16

+0

我可以說至少在C++ 11中,*要求:s不能是空指針。* ergo不檢查。 C++ 03是一樣的。 – chris 2014-10-10 02:13:15

2

通常你可以輸出一個指向cout的指針,它將打印出包含的地址。但是,當您輸出char *時,它將被解釋爲C樣式的以null結尾的字符串。在這種情況下,它是一個空指針,並不指向一個字符串。

嘗試在輸出之前將其轉換爲void *