计算结构体的大小需要的偏移量的知识:
偏移量是指结构体变量中成员的地址和结构体变量的地址的差。第一个成员的偏移量为0,第二个成员的偏移量为第一个成员的偏移量加上第一个成员的大小,依次类推。。。。
(1)无结构体嵌套的情况
结构体的大小为最后一个成员的偏移量+其所占的字节数,除了这个准则外,还需要满足以下的两个原则:
1:结构体中成员的偏移量必须是该成员所在字节数的整数倍。
2:结构体的大小必须是所有成员的整数倍,即最小公倍数。。
(2)有结构体嵌套的情况
需要将嵌套的结构体展开,并且被展开结构体的第一个成员变量的偏移量必须为这个被展开结构体中所占最大字节成员的整数倍。并符合上述1:2:的原则。
对于嵌套结构体的计算方式,除了文中说的被展开结构体的第一个成员变量的偏移量
必须是这个被展开结构体成员最大字节的最小整数倍外,还需要注意的是如果该结构体展开后后面还有成员,最后一个例子(char c),在计算这个偏移量的时候也要满足被展开结构体成员最大字节(int i)的最小整数倍,目的是保障struct A的大小。
举例子说明一下
#include
struct StructA {
char c1;
int i;
char c2;
};
struct StructB {
char c1;
char c2;
int i;
};
struct Stu5 {
char i;
struct {
char c;
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
};
struct StructC {
int a;
char b;
int d;
struct StructA h;
char c;
};
int main()
{
printf("sizeof A is %zu\n", sizeof(struct StructA));
printf("sizeof B is %zu\n", sizeof(struct StructB));
printf("sizeof stu5 is %zu\n", sizeof(struct Stu5));
printf("sizeof C is %zu\n", sizeof(struct StructC));
return 0;
}

解析如下
struct StructA {
char c1;
int i;
char c2;
};
|
成员 |
所占字节数 |
偏移量 |
|
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 StructB {
char c1;
char c2;
int i;
};
|
成员 |
所占字节数 | |
|
Char c1 |
1 | |
|
Char c2 |
1 | |
|
Int i |
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 | |
|
Char c |
1 | |
|
Int j |
4 | |
|
Char a |
1 | |
|
Char b |
1 | |
|
Char d |
1 | |
|
Char e |
1 | |
|
Char f |
1 | |
|
结构体大小 |
理论为17,必须为4的倍数,故为20 | |
struct StructA {
char c1;
int i;
char c2;
};
struct StructC {
int a;
char b;
int d;
struct struct A h;
char c;
};
|
成员 |
成员所占字节 | |
|
Int a |
4 | |
|
Char b |
1 | |
|
Int d |
4 | |
|
Char c1 |
1 | |
|
Int i |
4 | |
|
Char c2 |
1 | |
|
Char c |
1 | |
|
结构体大小 |
理论为25,必须为4的倍数,故为28 | |
下面新增加一个例子。
struct A
{
char c1;
double i;
char c2;
};
struct C
{
int a;
char b;
int d;
structA h;
char c;
};
所占字节 偏移量
int a; 4 0
char b; 1 4
int d; 4 5->8
char c1; 1 12->16 //第一个成员变量的偏移量必须是这个被展开结构体成员最大字 节的最小整数倍
double i; 8 17->24
char c2; 1 32
char c 1 33->40//满足便宜量是8的倍数,主要是需要保障struct A的大小
结构体大小为41 需要满足所有成员的整数倍->48,所以这个结构体大小为48.
2744

被折叠的 条评论
为什么被折叠?



