最近遇到一个题目是关于回答结构体成员变量地址偏移量的,实际运行的时候出乎我自己的想象!

看看以下结构体实例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个字节)。

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程

3550 9.8元 98元 1折
7295 0元 45元 限免