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 */
疑问解答
为何输出中所有对象的Age指针地址完全相同?
构造函数里的Age是函数形参,存储在栈帧中。每次调用构造函数后,函数执行完毕对应的栈帧会被销毁,下次调用构造函数时系统会复用这块栈空间,导致每次构造函数形参Age的栈地址完全一致。而代码中把这个形参的地址赋值给了成员变量Age,所以所有对象的Age指针都指向了同一个栈地址。构造函数参数为int类型,为何可传入常量值并取其地址?常量无明确内存位置,该操作为何合法?
你取的不是常量字面量的地址,而是构造函数形参的地址。当传入35这类常量时,编译器会先把常量值复制到构造函数的形参Age中——这个形参是栈上的普通int变量,有明确的内存位置。因此对形参Age取地址是合法操作,和取普通局部变量地址没有区别。但要注意,构造函数执行完毕后这个形参会被销毁,成员变量Age会变成悬空指针,后续访问它指向的内容属于未定义行为。每个对象的int Age成员变量是否未被独立复制?*
每个Human对象的int* Age成员是独立的——每个对象都有自己的Age指针变量,存储在各自的对象内存空间中。但这些指针变量的值(即指向的地址)是相同的,因为它们都被赋值为构造函数形参的地址。简单来说:指针本身每个对象各有一份,但它们指向了同一个内存位置。
内容的提问来源于stack exchange,提问作者imheretolearn
相关产品推荐
相关产品推荐

