gpt4 book ai didi

c++ - union 成员(member)地址需要说明

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:50 25 4
gpt4 key购买 nike

我写了下面的代码:

#include <iostream>
using namespace std;

union Packed
{
char i;
short j;
int k;
long l;
float f;
double d;
};

int main()
{
cout<<"sizeof(Packed) = "<< sizeof(Packed)<<endl;
Packed x;
cout<<"Address j ="<<&(x.j)<<endl;
cout<<"Address i ="<<&(x.i)<<endl;
cout<<"Address k ="<<&(x.k)<<endl;
cout<<"Address l ="<<&(x.l)<<endl;
cout<<"Address f ="<<&(x.f)<<endl;
cout<<"Address d ="<<&(x.d)<<endl;
return 0;
}

输出:

sizeof(Packed) = 8

Address j =0x7fff587a71a0
Address i =

Address k =0x7fff587a71a0
Address l =0x7fff587a71a0
Address f =0x7fff587a71a0
Address d =0x7fff587a71a0

当我修改代码如下:

  cout<<"Address j ="<<(long)&(x.j)<<endl;
cout<<"Address i ="<<(long)&(x.i)<<endl;
cout<<"Address k ="<<(long)&(x.k)<<endl;
cout<<"Address l ="<<(long)&(x.l)<<endl;
cout<<"Address f ="<<(long)&(x.f)<<endl;
cout<<"Address d ="<<(long)&(x.d)<<endl;

我得到输出:

Address j =140736718889408
Address i =140736718889408
Address k =140736718889408
Address l =140736718889408
Address f =140736718889408
Address d =140736718889408

我有点困惑,为什么当我只是打印 union 中所有变量的基地址时,我没有得到 union 中字符变量的正确地址,这应该与“长”时确认的相同在代码的第二部分进行类型转换。

请为混淆提供解释。输出列为在 Fedora FC17 Linux 机器上获得。

最佳答案

在 ostream 中有一个 char const* 变量的重载。将所有指针转换为 void const* 以获得正确的结果。

哦,在我忘记之前:使用 static_cast() 并且永远不要使用 C 风格的转换,除非你真的知道你必须这样做!

关于c++ - union 成员(member)地址需要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com