结构体类型对齐问题----例题及方法详细解析

#include<stdio.h>
//struct A
//{
//    int a;
//    short b;
//    int c;
//    char d;
//};
//struct B
//{
//    int a;
//    short b;
//    char c;
//    int d;
//};
//int main()
//{
//    struct A sa = { 0 };
//    struct B sb = { 0 };
//    printf("%d\n", sizeof(sa));//16=4+2+2+4+1+3
//    printf("%d\n", sizeof(sb));//12=4+2+1+1+4
//}

/*#pragma pack(4)*///编译选项,按照四个字节对齐

//从第二个变量开始,看开始位置的下标是否是第二个元素变量类型的整数倍,是的话,就放,不是的话
//浪费到最大对齐数的整数倍再放,第三个变量,看开始位置的下标是否是第二个元素变量类型的整数倍
//是的话,就放,不是的话,浪费到最大对齐数的整数倍再放...
//所占字节数是不是最大对齐数的整数倍呢?是的话就是所占字节,不是的话就浪费到最大对齐数
//的整数倍为止
//如
//int main()
//{
//    struct A
//    {
//        short a;//下标为0开始放                                      放0-1
//        char d;//下标为2,是1的整数倍 ,不用浪费,下标为2开始放      放2
//        long b;//下标为3,不是4的整数倍,浪费到4,下标为4开始放      放4-7
//        long c;//下标为8,是4的整数倍,不用浪费,下标为8开始放       放8-11
//               //下标为11,总共是12字节,是最大整数4的整数倍,不用浪费  放12
//    };
//    struct B
//    {
//        long b;//下标为0开始放                                        放0-3
//        short c;//下标为4,是2的整数倍,不用浪费,下标为4开始放        放4-5
//        char d;//下标为6,是1的整数倍,不用浪费,下标为6开始放        放6
//        long a;//下标为7,不是4的整数倍,浪费到8,下标为8开始放,      放8-11
//               //下标为11,总共是12字节,是最大整数4的整数倍,不用浪费   放12
//    };
//    struct C
//    {
//        short c;//下标为0                                             放0-1
//        long b;//下标为2,不是4的整数倍,需要浪费,下标为4开始放      放4-7
//        char d;//下标为7,是1的整数倍,不需要浪费,下标为7开始放      放8
//        long a;//下标为9,不是4的整数倍,需要浪费,下标为12开始放     放12-15
//               //下标为11,总共是12字节,是最大整数4的整数倍,不用浪费   放16
//    };
//    struct A stA;
//    struct B stB;
//    struct C stC;
//    printf("%d %d %d", sizeof(stA), sizeof(stB), sizeof(stC) );//12 12 16-----
//    //看下标,下标满足下一个变量类型的整数倍才可以放
//    //str A中2+1(1是任何数的整数倍,不用浪费)+2(此时下标为2,需要浪费到4的整数倍,下标为4
//    // 处开始放)+4(int型)+4(int型)=12(是最大对齐数4的整数倍,不用浪费)
//    //str B中4+1(此时下标为3,short型需要是2的整数倍,浪费到下标为4)+1(1是任何数的整数倍,
//    //不用浪费)+(此时下标为5,long型需要是4的整数倍,浪费到下标为8)+3(此时为9个字节,不是最
//    //大对齐数4的整数倍,需要浪费到12)
//    return 0;
//}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力成为焦耳定律鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值