提问人:jurkDang 提问时间:6/24/2023 最后编辑:jurkDang 更新时间:6/24/2023 访问量:87
为什么 cout 和 char 操作相同的表达式不返回相同的答案
why cout &char operation same expresion not return the same answer
问:
#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不同?
答:
这个问题
char c = 'x';
cout << &c << endl;
是说,既然是 ,它将使用这个运算符<<
:&c
char*
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
\0
length
x
\0
如果要打印其地址,请强制转换为:void*
std::cout << static_cast<void*>(&c) << '\n';
您正在读取越界,因此您的程序的行为是未定义的。c
当 a 传递给 的运算符时,它会将该指针视为 c 样式的 nul 终止字符串。这意味着它将继续从指针指向的字节开始的连续字节中读取字符,直到找到 nul (0) 字节。char*
std::cout
<<
但是单个不是以 nul 结尾的,因此会尝试从对象之后读取数据,从而导致未定义的行为。在实践中,它最终会徘徊在表示 的字节中,并将它们解释为字符。最终,它会找到一个 nul 字节并停止(希望在它徘徊在进程当前映射的地址空间之外并崩溃之前)。char
cout
char
int
222222
评论
char
cout
void*
cout << static_cast<void*>(&c) << endl;
char*
char const*
<<