关于sizeof(struct X)

在32位操作系统下,有下面的的结构体定义,则sizeof(struct Test)的值为(   )

struct Test{
		char a;    //1
		int b;     //8
		char c;    //12
		short d;   //12
		char e;    //16
		char f;    //16
};
  • A  10
  • B  12
  • C  16
  • D  14

答案:C

备注:题目“//”后是每一行把后面成员全注释掉时的大小。

解析:

        关于sizeof(struct X),其中主要包括两种对齐填充,从第一个成员开始依次计算:

                                ​​​​​​​        ​​​​​​​前一成员偏移量+(填充量)+当前成员大小

        当前一成员偏移量不是当前成员大小的非零整数倍时,先进行一次填充,再加上当前成员大小,求到最后一个成员后,总和还需要判断是否为每一个成员大小的公倍数,若不是,则再进行一次补齐填充,补到最接近的公倍数。

例如题中求到"int b"时,首先:

        char a的偏移量 =         0         +                  0            +                  1                         = 1,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        而sizeof(b)即sizeof(int) = 4,(前一成员偏移量)1 / sizeof(int) = 1 / 4 = 0,所以先进行填充,1+(填充量)3 = 4,

         int b  的偏移量 =         1         +                  3            +                  4                ​​​​​​​         = 8,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

依此类推,直到最后一个成员:

        

         char c的偏移量 =         8         +                  0            +                  1                ​​​​​​​        = 9,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        

       short d的偏移量 =         9         +                  1            +                  2                ​​​​​​​         = 12,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        char e的偏移量 =         12         +                  0            +                  1                ​​​​​​​       = 13,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        char f的偏移量 =         13         +                  0            +                  1                ​​​​​​​         = 14,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

        最后,判断14是不是char(1),short(2),int(4)的公倍数,显然不是,加上填充量2,最终sizeof(struct Test) = 16。

下面举例计算64位操作系统下带结构体嵌套的sizeof(struct X)

struct AA{
    int a;
    char b;
};
struct BB{
    char a;
    struct AA b;
    short c;
    long d;
};

计算sizeof(struct BB):

char a的偏移量 =         0         +                  0            +                  1                         = 1,

                ​​​​​​​        ​​​​​​​ 前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

struct AA b的偏移量 =  1         +                  3            +                  8                         = 12,

                ​​​​​​​        ​​​​​​​ 前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

short c的偏移量 =         12        +                  0            +                  2                         = 14,

                ​​​​​​​        ​​​​​​​  前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

long d的偏移量 =         14         +                  2            +                  8                         = 24,

                ​​​​​​​        ​​​​​​​        前一成员偏移量​​​​​​​      ​​​​        填充量    ​​​​​​​                当前成员大小

最后,判断24是不是char(1),short(2),long(8)的公倍数,显然是,最终sizeof(struct Test) = 24。

小结:

记录学习sizeof(struct X),欢迎交流

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值