C语言位段相关疑惑,该如何解决

C语言位段相关疑惑
对于位段结构体相关代码如下: 
typedef struct
{  
  unsigned char a : 3; 
  unsigned short b : 10;
  unsigned char c : 1;  
  unsigned char d : 2;
}Test_Struct;

int _tmain(int argc, _TCHAR* argv[])
{
  Test_Struct aa;
  aa.a = 3;
  aa.b = 10224;
  aa.c = 1;
  aa.d = 2;
  printf("0x%x,0x%x,0x%x, 0x%x-0x%x-0x%x-0x%x\r\n", &aa, aa, sizeof(Test_Struct), aa.a, aa.b, aa.c, aa.d);
  return 0;
}
为什么打印出来的数据是0x12ff4c,0xcff0cccb,0xcccd, 0x6-0x3-0x3f0-0x1?成员和长度完全不对。谢谢回答。

------解决方案--------------------
从结果看,应该是位置错位导致的,0xcccd不知道是那里出来的,
去掉显示前边两个&aa, aa试试把,应该就没问题了

------解决方案--------------------
第一个指针不会影响,因为在32位平台一个指针刚刚好和int一样大。严格地应该转型。但是你的结构体却不只4字节。却把它当int输出。printf不该有非内置类型的参数。而且要严格匹配。