今天下午权哥忽然发过来一道题,后来说明是网上流传的一道关于字节对齐的题,很久没做了。尝试着想啊想啊做了下。也算做出来了
#pragma pack(8)
struct s1{
short a;
long b;
};
struct s2{
char c;
s1 d;
long long e;
};
#pragma pack()
问
1.sizeof(s2) = ?
2.s2的s1中的a后面空了几个字节接着是b?
回忆中的思路是:
s1 short(2) long(4)
0 1 2 3 4 5 6 7 8 9 10
short long 算错了
对齐的原则是取小 当前类型与pack(n)的字节数取小的那一个
short占两个字节后当前地址为2 long为四字节。可以被整除2 所以不用添字节
所以 sizeof(s1) = 6 算错了这个地方算错了。。非常对不起大家。。重写的那天。。头晕。。按1字节算了
也多谢朋友的提醒,以后一定注意.
重新修正为
s1 short(2) long(4)
0 1 2 3 4 5 6 7
short 补 long
对齐的原则是取小 当前类型与pack(n)的字节数取小的那一个
short占两个字节 long是占四个字节。所以需要当前地址可以被4整除 所以。。补两个字节
所以 sizeof(s1) =8然后来算s2
char(1) s1被拆分 (short(2) long(4) 结构体拆分后按最大字节对齐) longlong(8)
0 1 2 3 4567 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
char 补 short long 补 longlong
所以sizeof(s2)=24
a后面空了2个字节接着是b
应该是没有问题的 还有一点。。如果最后位数不够的话。。。是按packer和结构体两个最小的字节数补齐