您的位置:首页 > 编程语言 > C语言/C++

c/c++ sizeof总结

2015-08-04 12:35 281 查看
偏移量:指的是结构体变量中成员的地址和结构体变量地址的差。

结构体大小等于最后一个成员的偏移量加上最后一个成员的大小.

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sizeof struct 结构