提问人:ConnellyM 提问时间:7/7/2023 更新时间:7/7/2023 访问量:48
内存地址的输出乱码 [duplicate]
output garbled of memory address [duplicate]
问:
这个问题在这里已经有答案了:
为什么将 char 指针流式传输到 cout 不打印地址? (4 个答案)
为什么不显示字符数据的地址? (8 个回答)
char* 不保存内存地址 [duplicate] (2 个答案)
5个月前关闭。
我正在学习使用static_cast并编写了以下代码,但是乱码的输出让我感到困惑。是什么原因导致输出出现乱码? 法典:
#include <iostream>
using namespace std;
class Base {
public:
char x;
};
class Derived : public Base {
public:
char y;
};
class Foo {
public:
char x;
};
class Derived2th : public Derived, public Foo {
public:
char z;
char j;
char k;
char l;
};
int main() {
int *p = new int(2);
Base a0;
Base a1;
Base a2;
Base* b = &a1;
// Foo* f = static_cast<Foo*>(b); // compile error
Derived2th* d = static_cast<Derived2th*>(b);
cout << d->y << endl;
d->y = 'p';
cout << "[address]a0:" << &a0 << endl;
cout << "[address]a1:" << &a1 << endl;
cout << "[address]a2:" << &a2 << endl;
cout << "[address]d->Base:x:" << &(d->Base::x) << endl;
cout << "[address]d->Foo:x:" << &(d->Foo::x) << endl;
cout << "[address]d->y:" << &(d->y) << endl;
return 0;
}
输出:
�
[address]a0:0x7ff7b058c148
[address]a1:0x7ff7b058c140
[address]a2:0x7ff7b058c138
[address]d->Base:x:`pX��
[address]d->Foo:x:X��
[address]d->y:pX��
据我了解,无论打印什么地址,它都应该始终是一个数字。那么为什么输出中会出现乱码呢?
答:
2赞
Toby Speight
7/7/2023
#1
首先,这是错误的:
Derived2th* d = static_cast<Derived2th*>(b);
由于是指向 的实例的指针,因此任何使用 is Undefined 行为(任何像样的静态分析器都会识别这个问题)。这就是为什么您需要非常小心 和 。更安全的是使用 - 但始终记住检查结果是否为 null(由于上述原因,它会在这里)。b
Base
d
static_cast
reinterpret_cast
dynamic_cast
字段的字符串输出是因为具有以下多个重载:char*
std::ostream
operator<<
operator<<(const void*)
打印指针的值。operator<<(const char*)
打印从指向位置开始的 C 样式(以 null 结尾)字符串。
评论
operator <<