偏移量:指的是结构体变量中成员的地址和结构体变量地址的差。
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小.
0被认为是任何数的整数倍
求结构体大小的2个原则:
1.偏移量为该成员大小的n倍.
2.总大小必须为最大成员大小的n倍.
用偏移量计算
struct s1
{
char a;//0
int b;//1 4
char c;//8
};//9
12
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1 4(1不是4的倍数所以,需要1 + 3)
c 的偏移量 为8
总大小为8+1 = 9
以上满足第一个条件.
第二个条件:9不是4的倍数,所以9+3
最后结果:12
struct s2
{
char a;//0
char b;//1
int c;//2
};//6
8
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1
c 的偏移量 为2
总大小为2+4 = 6
以上满足第一个条件.
第二个条件:6不是4的倍数,所以6+2
最后结果:8
struct s3
{
int a;//0
char b;//4
short c;//5 6
double d;//8
int f;//16
}s3;//20
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
d 的偏移量 为8
f 的偏移量 为16
总大小为16+4 = 20
以上满足第一个条件.
第二个条件:20不是8的倍数,所以20+4
最后结果:24
在结构体中包含有结构体,将结构体中最大成员大小作为整除。
struct s1
{
char a;
int b;
char c;
};//12
struct s2
{
char a;//0
s1 s;//1 4
char b;//16
int c;//17
};//21
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
s 的偏移量 为1 4(s1中最大成员字节数为4,所以应把4作为除数,1不是4的倍数,所以需要1+3)
b 的偏移量 为16 (s1的整体占字节数为12个,所以偏移量为4+12)
c 的偏移量 为17
总大小为17+4 = 21
以上满足第一个条件.
第二个条件:21不是4的倍数,所以21+3
最后结果:24
struct s3
{
int a;//0
char b;//4
short c;//5 6
s2 ss;//8
double d;//32
int f;//40
}s3;//44
//48
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
ss 的偏移量 为 8
d 的偏移量 为32 (8 + 24)
f 的偏移量 为40
总大小为40+4 = 44
以上满足第一个条件.
第二个条件:44不是8的倍数,所以44+4
最后结果:48
各种sizeof求大小的面试题。
http://blog.csdn.net/wangshihui512/article/details/9116051#comments