使用字符双指针时输出奇怪

Weird output when using char double pointer

本文关键字:输出 指针 字符      更新时间:2023-10-16

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

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

这是我的输出:

A
A����

ex2被声明为char**,这意味着它是一个指向字符的指针

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

实际上,编译器假定您要打印 C 样式字符串,这是一个以NULL结尾的字符串。因此,它会打印存储在内存中的所有字节,从存储在ex1_val A开始,然后是直接存储的随机值,直到NULL字符被加密。

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

要通过ex2指针打印出ex1_val的实际内容,您需要将其设置为这样:

cout << **ex2 << endl;

其中typeof(**ex2)是实际char

当你取消引用ex2(在*ex2中)时,你会得到一个指向char的指针(即 char* ),处理char*operator<<重载将其输出为 C 样式的零终止字符串

由于*ex2不指向以零结尾的字符串,只指向单个字符,因此会出现未定义的行为

你想做cout << **ex2 << endl;

ex2 ,正如您声明的那样,作为指向字符的指针。执行*ex2只会获得它指向的指针的地址。