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

C++对象与指针疑问:为何所有Age地址相同及相关问题

问题解答

代码示例

#include <iostream>

struct Human {
public:
    std::string Name; 
    int* Age;
    Human(std::string Name, int Age): Name{Name}, Age{&Age} {}
    void Print() {
        std::cout << Name << " " << Age << "\n";
    }
};

int main() {
    Human a = Human("John", 35);
    Human b = Human("Brook", 20);
    Human c = Human("Lamy", 90);
    Human d = Human("Ed", 5);
    a.Print();
    b.Print();
    c.Print();
    d.Print();
}

/* Output
John 0x7bfc80
Brook 0x7bfc80
Lamy 0x7bfc80
Ed 0x7bfc80
*/

疑问解答

  1. 为何输出中所有对象的Age指针地址完全相同?
    构造函数里的Age是函数形参,存储在栈帧中。每次调用构造函数后,函数执行完毕对应的栈帧会被销毁,下次调用构造函数时系统会复用这块栈空间,导致每次构造函数形参Age的栈地址完全一致。而代码中把这个形参的地址赋值给了成员变量Age,所以所有对象的Age指针都指向了同一个栈地址。

  2. 构造函数参数为int类型,为何可传入常量值并取其地址?常量无明确内存位置,该操作为何合法?
    你取的不是常量字面量的地址,而是构造函数形参的地址。当传入35这类常量时,编译器会先把常量值复制到构造函数的形参Age中——这个形参是栈上的普通int变量,有明确的内存位置。因此对形参Age取地址是合法操作,和取普通局部变量地址没有区别。但要注意,构造函数执行完毕后这个形参会被销毁,成员变量Age会变成悬空指针,后续访问它指向的内容属于未定义行为。

  3. 每个对象的int Age成员变量是否未被独立复制?*
    每个Human对象的int* Age成员是独立的——每个对象都有自己的Age指针变量,存储在各自的对象内存空间中。但这些指针变量的值(即指向的地址)是相同的,因为它们都被赋值为构造函数形参的地址。简单来说:指针本身每个对象各有一份,但它们指向了同一个内存位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:15:46