You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段代码输出不一致?类指针获取A类内存地址异常

分析类指针内存地址不一致的常见场景与解决方案

作为经常处理这类内存问题的开发者,我先给你梳理几个最容易导致这种现象的典型情况,你可以对照自己的代码排查:

1. 继承体系中的虚函数与指针类型偏移

如果你的类A是带虚函数的基类,且存在子类继承,当子类指针转换为基类指针时,地址可能会出现偏移(多继承场景下更明显)。这是编译器为了正确访问虚函数表(vtable)的正常行为,并非bug。举个例子:

class A {
public:
    virtual void func() {}
};

class B : public A {
public:
    int extra_data;
};

int main() {
    B* b_ptr = new B();
    A* a_ptr = b_ptr;
    // 输出的地址可能不同
    std::cout << "子类指针地址: " << b_ptr << std::endl;
    std::cout << "基类指针地址: " << a_ptr << std::endl;
    return 0;
}

2. 错误的地址打印格式

如果打印指针时用错了格式符,会导致地址显示异常。比如在C语言中用%d(整数格式)打印指针,或者在C++中混用不匹配的输出方式,都会出现看似“不一致”的结果:

A* a_ptr = new A();
// 错误:用整数格式打印指针,可能截断或显示错误值
printf("错误地址输出: %d\n", a_ptr);
// 正确:用指针专用格式符或C++原生输出
printf("正确地址输出: %p\n", a_ptr);
std::cout << "正确地址输出: " << a_ptr << std::endl;

3. 对象地址与成员地址混淆

如果误将类成员变量的地址当成对象本身的地址,自然会得到不同的结果:

class A {
public:
    int member;
};

A* a_ptr = new A();
// 这是对象a_ptr的地址
std::cout << "对象地址: " << a_ptr << std::endl;
// 这是成员member的地址,和对象地址存在固定偏移
std::cout << "成员地址: " << &(a_ptr->member) << std::endl;

4. 指针变量自身地址 vs 指向对象的地址

还有一种常见误区是混淆了指针变量在栈上的地址,和它指向的堆对象地址:

A* a_ptr = new A();
// 指向的堆对象地址
std::cout << "对象地址: " << a_ptr << std::endl;
// 指针变量a_ptr自己在栈上的地址
std::cout << "指针变量地址: " << &a_ptr << std::endl;

如果你的情况不在上述场景里,可以把具体代码和输出贴出来,我再帮你针对性分析~

内容的提问来源于stack exchange,提问作者Indie Developers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:28:25