最近遇到一个题目是关于回答结构体成员变量地址偏移量的,实际运行的时候出乎我本身的想象!测试
看看如下结构体实例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会占用8个字节,没错吧?可是在个人嵌入式MIPS上运行测试程序能够知道long实际上只是占用4个字节!程序
而后假设结构体truct的地址是0x30000000,那么它也是truct.char_i的地址,truct.short_i的地址是0x30000001,以此类推,0x30000003,0x30000003, 0x30000007,0x3000000b, 0x3000000c。但实际运行的结果倒是truct.short_i的地址为0x30000002,truct.int_i的地址为0x30000004,truct.long_i的地址为0x30000008,truct.char_j的地址为0x3000000c,truct.int_j的地址为0x30000010。因此是,原本觉得short_i的地址偏移量是1,但结果倒是2;原本觉得int_j的地址偏移量是在char_j的地址偏移量基础上加上1,结果倒是加上4。网上查了一下,才发现结构体存储变量的地址对齐有两个规则:1.结构体中成员变量的地址偏移量必须是该成员大小的整数倍 2.结构体大小必须是全部成员大小的整数倍。因此是,因为short_i占用2个字节,因此它的地址偏移量不能是1,而应该是2;因为int_j占用4个字节,因此char_j的地址偏移量加上4做为4的整数倍,才能是int_j的地址偏移量。按照该原则,整个结构体的大小必须是4的整数倍。目前的结构体大小是20。若是我把int_j的类型改成char,结果int_j的偏移量变成了0x3000000d,而结构体的大小变成了16,而不是12(后面填充了4个字节)。嵌入式