您的位置:首页 > 其它

结构体字节大小计算方法

2018-05-29 20:19 267 查看

计算结构体的大小需要的偏移量的知识:

       偏移量是指结构体变量中成员的地址和结构体变量的地址的差。第一个成员的偏移量为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;  

  21c80     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


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