2016-03-15 61 views
0

當我從去年COUT聲明很奇怪的輸出,不知道會是什麼造成這樣的:奇怪的輸出使用字符雙指針

char ex1_val = 'A'; 
char* ex1; 
ex1 = &ex1_val; 
cout << *ex1 << endl; 
char** ex2; 
ex2 = &ex1; 
cout << *ex2 << endl; 

這裏是我的輸出:

A 
A���� 
+1

是不是**假設是一個二維數組? – AchmadJP

+3

'cout'不是[tag:c] – LPs

+0

'* ex2'是一個指向c風格字符串的指針,例如。 cout打印字符,直到找到null終止符 – nikniknik2016

回答

3

ex2聲明作爲char**,這意味着它是指向指向char的指針。

當您打印的*ex2的內容,你解引用它一次,所以*ex2類型是爲char的指針。

有效,編譯器假定,要打印C風格的字符串,這是一個NULL封端的字符串。因此它會打印存儲在內存中的所有字節,從存儲在ex1_val中的A開始,然後是隨機值,之後直接存儲,直到獲得NULL字符。

這實際上是一個非常糟糕的情況,因爲你永遠不知道如果有一個在內存中的NULL。您最終可能會嘗試訪問您不允許使用的內存區域,這可能會導致應用程序崩潰。這是未定義行爲的示例UB)。

要通過ex2指針打印出的ex1_val實際內容,你需要做這樣的:

cout << **ex2 << endl; 

其中typeof(**ex2)是一個實際的char

1

當取消引用ex2(在*ex2)你得到一個指針指向一個char(即char*),並且operator<< overload處理char*輸出它作爲一個C風格零結尾

既然*ex2沒有指向以零結尾的字符串,只有一個字符,你會得到未定義的行爲

1

你想幹什麼cout << **ex2 << endl;

ex2,因爲你已經宣佈它作爲一個指針的指針一個字符。做*ex2只會讓你指向它所指向的指針的地址。