用最简单的方法,通俗易懂的方法计算结构体大小。
结构体计算要遵循字节对齐原则。
结构体默认的字节对齐一般满足三个准则:
其实暂且不管这三原则,我的方法只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍。
先看下面定义的两个结构体:
- struct { char a; short b; char c; }S1;
-
- struct { char a; char b; short c; }S2;
分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4。
注意: 为什么 仅仅改变了结构体成员的顺序,结果不一样?
解:
对于 S1 来说,顺序是char->short->char:
所以对于 S1 结构体大小为 2*3=6,至于为什么第二个 char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍。
- S1=2*3=6
对于 S2 嘛,也画个图,但是顺序是char->char->short:
- S2=2*2=4
按照这个方法再看这样的一个结构体:
- struct stu1
- {
- int i;
- char c;
- int j;
- };
很明显,最大字节为 4 个。顺序 int char int:
因为 int 占 4 个,而 char 已经占了一个,不够,所以那三个只能多余占位。
- Stu1=3*4=12
那么换一下呢?
- struct stu2
- {
- int i;
- int j;
- char c;
- };
- Stu2=3*4=12
再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行。
- typedef struct A
- {
- char a1;
- short int a2;
- int a3;
- double d;
- };
-
- A=16
-
- typedef struct B
- {
- long int b2;
- short int b1;
- A a;
- };
而对于 B,先不要管 A a,也就是先去掉 A a 成员结构体 B 算出其为 8,所以最后结果为 8+16=24;24 才是最后结果。