计算结构体的大小需要的偏移量的知识:
偏移量是指结构体变量中成员的地址和结构体变量的地址的差。第一个成员的偏移量为0,第二个成员的偏移量为第一个成员的偏移量加上第一个成员的大小,依次类推。。。。
(1)无结构体嵌套的情况
结构体的大小为最后一个成员的偏移量+其所占的字节数,除了这个准则外,还需要满足以下的两个原则:
1:结构体中成员的偏移量必须是该成员所在字节数的整数倍。
2:结构体的大小必须是所有成员的整数倍,即最小公倍数。。
(2)有结构体嵌套的情况
需要将嵌套的结构体展开,并且被展开结构体的第一个成员变量的偏移量必须为这个被展开结构体中所占最大字节成员的整数倍。并符合上述1:2:的原则。
举例子说明一下
#include <stdio.h>
struct A
{
char c1;
int i;
charc2;
};
struct B
{
charc1;
charc2;
int i;
};
struct stu5
{
char i;
struct
{
char c;
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
};
struct C
{
inta;
charb;
intd;
structA h;
charc;
};
int main()
{
printf("sizeof A is %d\n",sizeof(struct A));
printf("sizeof B is %d \n",sizeof (struct B));
printf("sizeof stu5 is %d \n",sizeof (struct stu5));
printf("sizeof c is %d \n",sizeof (struct C));
return0;
}
解析如下
struct A
{
charc1;
inti;
charc2;
};
成员 |
所占字节数 |
偏移量 |
Char c1 |
1 |
0 |
Int i |
4 |
本来为1+0,需要满足条件1,故偏移量为4 |
Char c2 |
1 |
4+4为8 |
结构体大小 |
1+8=9不满足2,需要扩展到4的倍数12,所以结构的大小为12 |
struct B
{
charc1;
charc2;
inti;
};
成员
所占字节数
偏移量
Char c1
1
0
Char c2
1
1+0为1
Int i
4
1+1为2,为了满足条件1,扩展到4
结构体大小
4+4=8,所以结构的大小为8
struct stu5
{
char i;
struct
{
char c;
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
};
成员 |
成员所占字节 |
偏移量 |
Char i |
1 |
0 |
Char c |
1 |
4(嵌套结构体的第一个变量的偏移) |
Int j |
4 |
理论为5,扩展为8 |
Char a |
1 |
12 |
Char b |
1 |
13 |
Char d |
1 |
14 |
Char e |
1 |
15 |
Char f |
1 |
16 |
结构体大小 |
理论为17,必须为4的倍数,故为20 |
struct C
{
inta;
charb;
intd;
structA h;
charc;
};
成员 |
成员所占字节 |
偏移量 |
Int a |
4 |
0 |
Char b |
1 |
4 |
Int d |
4 |
理论为5,扩展为8 |
Char c1 |
1 |
12并满足(int i)4的倍数 |
Int i |
4 |
理论13,扩展为16 |
Char c2 |
1 |
20 |
Char c |
1 |
理论为21,需要为4的倍数,扩展为24 |
结构体大小 |
理论为25,必须为4的倍数,故为28 |