结构体中成员变量的地址偏移量

看看以下结构体实例

truct:  struct trc{ 
  char char_i; 
  short short_i;
  int int_i; 
  long long_i; 
  char char_j; 
  int int_j; 
} truct;

首先,我自然地认为,char占用一个字节,short占用2个字节,int占用4个字节,long占用4个字节(32位机器)。
假设结构体truct的地址是0x30000000。


结构体成员变量偏移量

原因:
结构体存储变量的地址对齐有两个规则:
1.结构体中成员变量的地址偏移量必须是该成员大小的整数倍
2.结构体大小必须是所有成员大小的整数倍。
ps:结构体变量的第一个成员变量起始地址和其自身的起始地址相同。

所以是,由于short_i占用2个字节,所以它的地址偏移量不能是1,而应该是2;由于int_j占用4个字节,所以char_j的地址偏移量加上4作为4的整数倍,才能是int_j的地址偏移量。按照该原则,整个结构体的大小必须是4的整数倍。目前的结构体大小是20。

如果我把int_j的类型改为char,结果int_j的偏移量变成了0x3000000d,而结构体的大小变成了16(后面填充了2个字节)。

你可能感兴趣的:(结构体中成员变量的地址偏移量)