结构体变量所占字节长度

本文详细解释了C语言中字节对齐的概念,如何影响不同数据类型在内存中的存储,以及结构体变量的地址、成员偏移量和总大小的计算。
摘要由CSDN通过智能技术生成

#include <stdio.h>
int main()
{
    //字节对齐:各种数据类型是按照一定的规则在内存当中排列的
    //字节对齐会加快计算机对数据的存取效率
    short a;
    int b;
    double c;
    printf("%d,%d,%d\n",(int)&a%2,(int)&b%4,(int)&c%8);//对a取地址然后强制类型转化成int型数据,然后对2取余
    //输出0,0,0,说明基本数据类型变量的地址是能够被他们所占字节的长度所整除的
    struct Stu1
    {
        char a;
        short b;
    };
    struct Stu2
    {
        char a;
        int b;
    };
    struct Stu1 A;
    struct Stu2 B;
    printf("%d,%d\n",(int)&A%2,(int)&B%4);//输出0,0  1.说明结构体变量的首地址能够被其最宽基本类型成员的大小所整除
    //输出A和B所占的字节数
    printf("%d,%d\n",sizeof(A),sizeof(B));//输出4,8  2.结构体成员相对于结构体变量的首地址的偏移量(结构体变量的地址编号和结构体成员的地址编号所差的字节数)都是其成员大小的整数倍
    printf("%d,%d\n",((int)&A.b-(int)&A)%2,((int)&B.b-(int)&B)%4);//得到A变量中b成员的地址,和A变量的地址,并把这两个地址强制数据类型转换成int型再相减,就会求得A变量当中b成员相对于A变量首地址的偏移量,再把这个偏移量对2取余,2是b成员所占的字节数
    //输出0,0
    struct Stu3
    {
        char a;
        double f;
        int b;
    }C;
    printf("%d\n",sizeof(C));//输出C变量所占的字节长度
    //输出结果为24                                    3.结构体的总大小为结构体最宽基本类型成员的整数倍
    struct Stu4
    {
        char a;
        struct Stu2 b;//结构体嵌套,b分为b.a(char型)和b.b(int)型,从这两个里边找一个最宽的基本类型成员,很明显是b.b
    }D;
    /*
    D中最宽的基本类型成员是D.b.b长度为4个字节,所以
    1.D的首地址必须被4整除
    2.D的长度必须被4整除
    struct Stu2数据类型可知:
    1.D.b的地址能够被4整除
    2.D.b的长度能够被4整除,D.b的长度为8
    */
    printf("%d\n",sizeof(D));//输出12   因为Stu2占8个字节
    //如果结构体成员是复合数据类型的,那么它相对于结构体首地址的偏移量,应该是其最宽基本类型成员大小的整数倍
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值