當我從去年COUT聲明很奇怪的輸出,不知道會是什麼造成這樣的:奇怪的輸出使用字符雙指針
char ex1_val = 'A';
char* ex1;
ex1 = &ex1_val;
cout << *ex1 << endl;
char** ex2;
ex2 = &ex1;
cout << *ex2 << endl;
這裏是我的輸出:
A
A����
當我從去年COUT聲明很奇怪的輸出,不知道會是什麼造成這樣的:奇怪的輸出使用字符雙指針
char ex1_val = 'A';
char* ex1;
ex1 = &ex1_val;
cout << *ex1 << endl;
char** ex2;
ex2 = &ex1;
cout << *ex2 << endl;
這裏是我的輸出:
A
A����
ex2
聲明作爲char**
,這意味着它是指向指向char的指針。
當您打印的*ex2
的內容,你解引用它一次,所以*ex2
類型是爲char的指針。
有效,編譯器假定,要打印C風格的字符串,這是一個NULL
封端的字符串。因此它會打印存儲在內存中的所有字節,從存儲在ex1_val
中的A
開始,然後是隨機值,之後直接存儲,直到獲得NULL
字符。
這實際上是一個非常糟糕的情況,因爲你永遠不知道當或如果有一個在內存中的NULL
。您最終可能會嘗試訪問您不允許使用的內存區域,這可能會導致應用程序崩潰。這是未定義行爲的示例(UB)。
要通過ex2
指針打印出的ex1_val
實際內容,你需要做這樣的:
cout << **ex2 << endl;
其中typeof(**ex2)
是一個實際的char
。
當取消引用ex2
(在*ex2
)你得到一個指針指向一個char
(即char*
),並且operator<<
overload處理char*
輸出它作爲一個C風格零結尾串。
既然*ex2
沒有指向以零結尾的字符串,只有一個字符,你會得到未定義的行爲。
你想幹什麼cout << **ex2 << endl;
ex2
,因爲你已經宣佈它作爲一個指針的指針一個字符。做*ex2
只會讓你指向它所指向的指針的地址。
是不是**假設是一個二維數組? – AchmadJP
'cout'不是[tag:c] – LPs
'* ex2'是一個指向c風格字符串的指針,例如。 cout打印字符,直到找到null終止符 – nikniknik2016