#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;
print '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- 3ubuntu 1)
表达方式都是一样的,为什么会不一样呢?
2条答案
按热度按时间l7mqbcuq1#
你正在阅读
c
的边界,因此你的程序的行为是未定义的。当
char*
传递给std::cout
的<<
操作符时,它将该指针视为c风格的以null结尾的字符串。这意味着它将从指针所指向的字节开始连续阅读字符,直到找到nul(0)字节。但是一个
char
不是nul终止的,所以cout
会尝试从char
对象后面读取数据,导致未定义的行为。在实践中,它最终会漫游到表示int
222222
的字节中,并将它们解释为字符。最后它会找到一个nul字节并停止(希望在它走出进程当前Map的地址空间并崩溃之前)。i7uaboj42#
问题是
因为
&c
是一个char*
,它将使用这个operator<<
:该函数将使用
std::char_traits<char>::length(reinterpret_cast<const char*>(s))
来计算要插入到流中的字符数。这个功能反过来s
指向的字符序列长度,即结束空字符的位置。因为你只有一个
char
(不是\0
),length
函数将读取内存中x
之后的任何内容。这具有未定义的行为,因此它可能会崩溃或在某处找到\0
并将大量垃圾插入流中。如果你想打印它的地址,转换为
void*
: