我写了以下代码:
#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
我有点困惑的是,为什么我在联合中的字符变量的情况下没有得到正确的地址,而我只是为联合中的所有变量打印基本地址,这应该与&#34时确认的相同;长&#34;在代码的第二部分中进行了类型化。
请提供有关混淆的解释。输出列在Fedora FC17 Linux机器上。
答案 0 :(得分:5)
ostream中的char const *变量有一个重载。将所有指针强制转换为void const *以获得正确的结果。
哦,在我忘记之前:使用static_cast()并且不要使用C风格的演员表,除非你真的知道你必须这样做!
答案 1 :(得分:0)
原因是C ++ ostreams为operator <<
重载char *
并将它们作为指向C风格(NULL终止)字符串的指针并打印出来。因为Packed x
是放在堆栈上的联合类型对象,所以它具有自动存储持续时间并且未初始化为0(如果x具有静态或线程存储持续时间,则会出现这种情况)。因此x.i
的值未定义,这就是您体验 print-nothing 行为的原因
Packed x;
cout<<"Address i ="<<&(x.i)<<endl; // nothing gets printed
这是未定义的行为。
您应该将表达式转换为void const*
指针以打印地址本身
Packed x;
cout<<"Address i ="<< static_cast< void const*> ( &x.i) << endl;