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

2018-06-18 03:59:32来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:9-6快速排序

下一篇:APUE 2 - 进程组(process group) 会话(session) job