我从最后一个cout语句得到了非常奇怪的输出,不知道是什么导致这个:
char ex1_val = 'A';
char* ex1;
ex1 = &ex1_val;
cout << *ex1 << endl;
char** ex2;
ex2 = &ex1;
cout << *ex2 << endl;
这是我的输出:
A
A����
答案 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来处理的指针1}}将其输出为C样式的零终止字符串。
由于char*
未指向以零结尾的字符串,只有一个字符,因此未定义的行为。
答案 2 :(得分:1)
您想要cout << **ex2 << endl;
ex2
是指向一个字符的指针的指针。执行*ex2
只能获得它指向的指针的地址。