结构体大小的计算方式

结构体大小的计算方式

1.结构体成员的偏移量必须是成员大小的整倍数(0被认为是任何数的整数倍)。

struct s1
{  
    char ch1;
    char ch2;
    char ch3;
    int i; // int i 遵循结构体运算法则第一条,偏移量是必须是当前成员的大小的整数倍
           // 逻辑偏移2 实际按照对其的规划,要偏移4
   int main()
{
	
    printf("s1;%d\n",sizeof(struct s1));  
    system("pause");
    return 0;
    }      

在这里插入图片描述
2.结构体大小必须是所有成员的整数倍(数组例外,结构体里的结构体例外)。

struct s2
{
    char ch1;
    int i;
    char ch2;
};
int main()
{
	
    printf("s2;%d\n",sizeof(struct s2));
    system("pause");
	return 0;
}

在这里插入图片描述
3.对齐方式很浪费空间,可是按照计算机的方式访问规则,这种对齐方式提高了效率。

带数组结构体;

struct s3
{
    char ch;
    int i;
    char str[10];
};
int main()
{
	
    printf("s3;%d\n",sizeof(struct s3));
    system("pause");
	return 0;
}

在这里插入图片描述

这个结构体的大小是20,先看前两个成员,大小是8,毋庸置疑,这个char类型的数组,只需要把它看做十个char连在一起即可,加起来就是18,再满足结构体大小为成员整数倍,所以大小就是20。不用考虑结构体大小是数组里的参数的整数倍。

带结构体的结构体的大小;

struct s4
{
    char ch;
    int i;
    struct s
    {
        char ch1;
        int j;
        double o;    
    };
    float f;
};
int main()
{
	
    printf("s4;%d\n",sizeof(struct s4));
 
	system("pause");
	return 0;
}

在这里插入图片描述
里面这个结构体的大小是8,那么是否结构体大小就要向8对齐呢?这个结构体的大小是20,很明显不是8的倍数。所以计算结构体大小时是把里面这个结构体就看做是一个char,和一个int,不是看做一个整体。

成员包含联合体的结构体;

// 联合体;
struct s5
{
    char ch;
    int i;
    union{
        char ch1;
        int j;    
    };
};
int main()
{
	
    printf("s5;%d\n",sizeof(struct s5));
	system("pause");
	return 0;
}

在这里插入图片描述
联合体大小就是成员中最大类型的大小,所以这个结构体大小是12.。。。。。

5、指定对齐值
(1)对齐值小于最大类型成员值
(2)对齐值大于最大类型成员值
有点儿超纲的两个,看老陈博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小王 -挺忙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值