使用char双指针时输出奇怪

时间:2016-03-15 07:31:41

标签: c++

我从最后一个cout语句得到了非常奇怪的输出,不知道是什么导致这个:

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

这是我的输出:

A
A����

3 个答案:

答案 0 :(得分:3)

12声明为ex2,这意味着它是指向char 指针的指针。

当您打印char**的内容时,您将取消引用一次,因此*ex2的类型指向char 的指针。

有效地,编译器假定您要打印 C样式字符串,这是一个以*ex2结尾的字符串。因此它打印存储在内存中的所有字节,从NULL中存储的A开始,然后直接存储随机值,直到遇到ex1_val个字符为止

这实际上是一个非常糟糕的情况,因为你不知道何时如果在内存中有NULL。您最终可能会尝试访问您不允许使用的内存区域,这可能会导致应用程序崩溃。这是未定义行为的示例 UB )。

要通过NULL指针打印ex1_val的实际内容,您需要这样做:

ex2

其中cout << **ex2 << endl; 是实际的typeof(**ex2)

答案 1 :(得分:1)

当您取消引用char(在ex2中)时,您会获得指向*ex2(即char)和operator<< overload来处理enter image description here的指针1}}将其输出为C样式的零终止字符串

由于char*未指向以零结尾的字符串,只有一个字符,因此未定义的行为

答案 2 :(得分:1)

您想要cout << **ex2 << endl;

正如你所声明的那样,

ex2是指向一个字符的指针的指针。执行*ex2只能获得它指向的指针的地址。