内存地址的输出乱码 [duplicate]

output garbled of memory address [duplicate]

提问人:ConnellyM 提问时间:7/7/2023 更新时间:7/7/2023 访问量:48

问:

我正在学习使用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��

据我了解,无论打印什么地址,它都应该始终是一个数字。那么为什么输出中会出现乱码呢?

C++ 库特

评论

3赞 user7860670 7/7/2023
“据我所知,无论打印什么地址,它都应该始终是一个数字。-不。接受指向 char 的指针的重载假定它是指向以 null 结尾的字符串的指针并打印该字符串。operator <<
0赞 ConnellyM 7/7/2023
@user7860670明白了。多谢。

答:

2赞 Toby Speight 7/7/2023 #1

首先,这是错误的:

    Derived2th* d = static_cast<Derived2th*>(b);

由于是指向 的实例的指针,因此任何使用 is Undefined 行为(任何像样的静态分析器都会识别这个问题)。这就是为什么您需要非常小心 和 。更安全的是使用 - 但始终记住检查结果是否为 null(由于上述原因,它会在这里)。bBasedstatic_castreinterpret_castdynamic_cast


字段的字符串输出是因为具有以下多个重载:char*std::ostreamoperator<<

  • operator<<(const void*)打印指针的值。
  • operator<<(const char*)打印从指向位置开始的 C 样式(以 null 结尾)字符串。