工会会员地址要求说明

时间:2014-08-03 16:58:10

标签: c++

我写了以下代码:

#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机器上。

2 个答案:

答案 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;