当前位置:   article > 正文

C语言中结构体的对齐规则、sizeof(结构体变量)_sizeof 结构体变量

sizeof 结构体变量

1、以最大类型的字节为单位

        结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的的整数倍的地方(比如int在32位机器上为4字节,则要从四字节的整数倍开始存储)。考虑如下一段代码:

  1. #include <stdio.h>
  2. struct example_1
  3. {
  4. int a;
  5. char b;
  6. short c;
  7. }A;
  8. struct example_2
  9. {
  10. char e[2];
  11. int f;
  12. double g;
  13. short h;
  14. }B;
  15. int main(int argc, char *argv[])
  16. {
  17. printf ("sizeof(struct example_1) = %d\n", sizeof(A));
  18. printf ("sizeof(struct example_2) = %d\n", sizeof(B));
  19. return 0;
  20. }

      上述代码的输出结果为:sizeof(struct example_1) = 8

                                              sizeof(struct example_2) = 24

        对于结构体A来说,其成员里面最大长度的类型为int型,在32位机器上为4Byte。所以该结构体以4字节对齐。

A:对于成员a来说首先会放到offset为0的地方占用四个字节。

      对于b,成员b为char类型,占用1个字节。所以:1  *  0 = 0,此时offset = 0的地方存放有成员a,所以不能存放成员b;1 * 2 = 2,此时offset = 2的地方也是a的存放地方,等等。指导1 * 4 = 4,此时offset = 4,此时该地址偏移的地方没有存放成员,可以用来存放成员,占用1字节的空间。

      对于c,c为short类型,占用2字节。所以:2 * 0 = 0,此偏移地址存放a;2 * 1 = 2, 此偏移地址存放a;2 * 2 = 4, 此偏移地址存放变量b;2 * 3 = 6,此时该偏移地址没有存放内容,可以用来存放变量c,占用2个字节。

        注意:结构体(struct)占用内存空间的大小,是其最大成员数据类型的整数倍。

aaaa
b*cc

        对于结构体B来说,其成员里面的最大类型为double类型,占用8字节空间。所以该结构体以8字节对齐。

B:对于成员e,数据类型为char类型,占用1个字节。所以,1 * 0  = 0, 没有被占用可以用来存放e,由于成员e是数组类型的成员,所以连续进行存放。

        f成员,数据类型为int类型,占用4个字节。所以,4 * 0 = 0, 该空间被占用;4 * 1 = 4, 该空间没有被占用,所以用来存放f成员。

        g成员,数据类型为double,占用8个字节。所以,8 * 0 = 0, 该空间被占用;8 * 1 = 8,该空间没有被占用,用来存放g。

        h成员,数据类型为short类型,占用2个自己。所以,直到,2 * 8 = 16,该空间没有被占用,用来存放h成员。

ee**ffff
gggggggg
hh******

2、结构体嵌套结构体时,以两者最大的数据类型对齐。

        如果一个结构体B嵌套一个结构体A,结构体A应从offset为A内部最大成员的整数倍的地方开始存储。考虑如下,代码。

  1. #include <stdio.h>
  2. struct example_1
  3. {
  4. int a;
  5. double b;
  6. float c;
  7. }A;
  8. struct example_2
  9. {
  10. char e[2];
  11. int f;
  12. double g;
  13. short h;
  14. struct example_1 i;
  15. }B;
  16. int main(int argc, char *argv[])
  17. {
  18. printf ("sizeof(struct example_2) = %d\n", sizeof(B));
  19. return 0;
  20. }

        上述程序的运行结果是:sizeof(struct example_2) = 48

        对于结构体B来说,B里面嵌套了结构体A,两者最大类型均为double类型,所以以8字节对齐。

B:

        e,类型为char类型,占用一个字节, 0 * 1 = 0, 该偏移地址没有被占用,所以用来存放e

        f,int类型,四个字节,4 * 1 = 4,该地址偏移没有被占用,可以用来存放f。

        g,double类型,占用8个字节,8 * 1 = 8, 该地址偏移没有被占用,可以用来存放g。

        h,short类型,占用2个字节,2 * 8 = 16,该地址偏移没有被占用,可以用来存放h。

        接下来,是其结构体成员 A,由于不能在B的结构体后面直接存放结构体A的成员,必须等A结构体存放完整,而且占用空间为结构体A对齐长度的整数倍之后的地址偏移,存放A的成员。

A:

        a,int类型,占用4字节空间,24 + 4 * 0 , 该地址偏移没有被占用,可以用来存放a。

        b , double类型,占用4字节空间, 24 + 8 * 1 , 该地址没有被占用,可以用来存放b。

        c,float类型,占用4字节空间, 24 + 4 * 3, 该地址没有被占用,可以用来存放c。

ee**ffff
gggggggg
hh******
aaaa****
bbbbbbbb
cccc****

注意:结构体成员的位置的先后顺序不同,占用的空间的大小也会不同。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/215343?site
推荐阅读
相关标签
  

闽ICP备14008679号