2016-03-15 60 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只会让你指向它所指向的指针的地址。