C++ 64 位计算机 ,显示 32 位堆地址

C++ 64 Bit machine , shows 32 Bit heap address

本文关键字:显示 地址 计算机 C++      更新时间:2023-10-16

我在一台64位Linux机器上创建了一个示例C++程序,该机器在VMware Player上运行,而不是主机作为Windows。下面是一个类代码。

        class operatorOverloadingTest{
            private:
                    int age;
                    char *name;
            public:
                    operatorOverloadingTest(int age){
                            this->age = age;
                            name = new char[10];
                            strncpy(name,"Indra",strlen("Indra"));
                    }   
                    void displayDetails(){
                            cout<<"My Name :"<<name<<endl;
                            cout <<"My age: "<<age<<endl;
                    }   
                    friend ostream & operator<<(ostream &out, const operatorOverloadingTest &myObj);
                    ~operatorOverloadingTest(){
                            delete name;
                            cout<<" nDestructor getting called"<<endl;
                    }
    };
In my Main function, created object of class:
1. By using new operator.
2. Stack Object.
int main(){
    operatorOverloadingTest *oOT = new operatorOverloadingTest(10);
    operatorOverloadingTest oOT1(30);

我知道,在 64 位机器上,内存地址以 8 字节表示。

当我使用 GDB 运行程序时,我看到以下地址:

p oOT
$1 = (operatorOverloadingTest *) 0x613c20
p &oOT
$2 = (operatorOverloadingTest **) 0x7fffffffe228
 &(oOT1.age)
$7 = (int *) 0x7fffffffe210
(gdb) p &(oOT->age)
$8 = (int *) 0x613c20

我的问题是,为什么堆中分配的对象显示 32 位地址表示形式,而堆栈上的对象 (oOT1) 显示 64 位地址表示形式,而我的操作系统是 64 位?(使用 uname -a 检查)。

我的问题是,为什么堆中分配的对象显示 32 位地址表示形式,而堆栈上的对象 (oOT1) 显示 64 位地址表示形式

当您查看 0x1234 时,您知道该实体至少有 16 位,但您无法判断它是 16 位、32 位还是 64 位实体,因为 GDB 不会打印前导零。

如果您想知道某个程序实体有多大,请尝试:

(gdb) print sizeof(oOT)
(gdb) print sizeof(&ooT)