【发布时间】:2023-04-03 21:36:01
【问题描述】:
我不明白为什么cout 在这段代码中不起作用:
#include<iostream>
using namespace std;
int main() {
int v = 65;
int* q = &v;
char** o = (char**)&q;
cout << o << endl; // output: 012FFCAC
cout << *o << endl; // output: A
cout << **o << endl; // output: A
printf("%c",*o); // cause an error
printf("%p",*o); // works and the output=&v
而cout 在此代码中的其他部分不起作用
#include<iostream>
using namespace std;
int main() {
char v = 65;
cout << &v << endl; // output: A╠╠╠╠▀?╞«4°O
【问题讨论】:
-
你的编译器应该给你一个警告。如果不是,请调整您的警告选项。
-
-克里斯没有警告
-
运算符
<<用于将const char *流式传输到输出流 假设指针指向以 nul 结尾的字符串(例如字符串文字)的第一个字符 - 即带有 char 的数组一个 nul(零)终止符,标记结束。传递&v意味着指针不是以nul 结尾的字符串的第一个字符,因为不能保证v之后的内存内容。因此行为是未定义的。 -
operator<<()的重载支持单个char的输出,另一个支持char *的输出(假设char *指向什么,如我在之前的评论中提到过)。通过一些它不期望的东西,并且行为是未定义的。同样,您的示例中的printf("%c", *o)具有未定义的行为,因为*o是char *,而%c告诉printf()char(不是char *)已通过。 -
不需要特殊的重载。如果你想要地址,你可以将
&v转换为不同的类型,通常是void *,这不会做字符串的事情。