使用字符双指针时输出奇怪
Weird output when using char double pointer
我从最后一个 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
只会获得它指向的指针的地址。
相关文章:
- 用指针预测输出
- 当使用通配符和null指针调用函数时,对输出的说明
- 以下与指针相关的代码的输出是什么?
- 用于输出矩阵的二维指针
- 为什么数组到指针的输出不相关
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 指针和类,输出
- 空指针(为缺少的输出数组调用的 create() 在 create,文件 /home/m/OpenCV/modules/
- 如何调试输出指向成员的指针
- 当(错误)将指针指向指针时,我将如何收到以下输出
- 如何传递unique_ptr<T>代替原始*输出*指针参数?
- 为什么 c_str() 在返回常量指针值时不输出地址
- C++指针输出一致性
- x86 上的指针大小和奇怪的字符输出
- 从未初始化的 C++ 指针仍输出为已初始化
- 多重输出指针到C 中的文件
- 如何在 c++ 中输出指针对象的属性(具有 2 个或更多属性)
- 输出指针上的const前缀
- 控制台在输出指针数组和C++迭代时崩溃
- 打印字符串流输出指针