为什么 cout 和 char 操作相同的表达式不返回相同的答案

why cout &char operation same expresion not return the same answer

提问人:jurkDang 提问时间:6/24/2023 最后编辑:jurkDang 更新时间:6/24/2023 访问量:87

问:

#include "iostream"

using namespace std;

int main() {
    char c = 'x';
    cout << &c << endl;
}

cout << &c << endl打印“x”

2.

#include "iostream"

using namespace std;

int main() {
    int x = 222222;
    char c = 'x';
    cout << &c << endl;
    cout << x << endl;
}

cout << &c << endl;打印 'xd',似乎是变量的地址

操作系统版本

Linux vm 5.19.0-45-generic #46-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 09:08:58 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

GCC 版本

gcc 版本 12.2.0 (Ubuntu 12.2.0-3ubuntu1)

表达方式是一样的,为什么cout不同?

C++ COUT 操作

评论

5赞 HolyBlackCat 6/24/2023
行为未定义。 给定的指针必须指向以 null 结尾的字符串,而您的指针则不是。charcout
5赞 fabian 6/24/2023
要打印地址,请将强制转换添加到 : 。否则,在过载再振期间,运算符的第二个操作数的强制转换 from to 是更好的匹配。void*cout << static_cast<void*>(&c) << endl;char*char const*<<

答:

4赞 Ted Lyngmo 6/24/2023 #1

这个问题

char c = 'x';
cout << &c << endl;

是说,既然是 ,它将使用这个运算符<<&cchar*

template< class Traits >
basic_ostream<char, Traits>&
    operator<<( basic_ostream<char, Traits>& os, const char* s );

该函数将使用 std::char_traits<char>::length(reinterpret_cast<const char*>(s)) 来确定要插入到流中的字符数。反过来,该功能

  • 返回指向 的字符序列的长度,即终止 null 字符的位置。s

由于您只有一个(不是),该函数将读取内存中的任何内容。这具有未定义的行为,因此它可能会崩溃或找到某个地方并将大量垃圾插入流中。char\0lengthx\0

如果要打印其地址,请强制转换为:void*

std::cout << static_cast<void*>(&c) << '\n';
4赞 Miles Budnek 6/24/2023 #2

您正在读取越界,因此您的程序的行为是未定义的。c

当 a 传递给 的运算符时,它会将该指针视为 c 样式的 nul 终止字符串。这意味着它将继续从指针指向的字节开始的连续字节中读取字符,直到找到 nul (0) 字节。char*std::cout<<

但是单个不是以 nul 结尾的,因此会尝试从对象之后读取数据,从而导致未定义的行为。在实践中,它最终会徘徊在表示 的字节中,并将它们解释为字符。最终,它会找到一个 nul 字节并停止(希望在它徘徊在进程当前映射的地址空间之外并崩溃之前)。charcoutcharint222222