求解结构体的大小(简单易懂)

一、C语言结构体对齐步骤:

        1.每个成员对齐

        2.总体对齐

二、C语言结构体对齐规则:

1.结构体第一个成员存放在相较于结构体变量起始位置的偏移量为0的位置

2.从第二个成员开始,往后的每一个成员都要对齐到某个对齐数的整数倍处。

        对齐数:结构体成员自身的大小和默认对齐数的较小值

        VS上默认对齐数是8

        gcc 没有默认对齐数,对齐数就是他本身大小

3.结构体的总大小,必须是最大对齐数的整数倍

   最大对齐数是:所有成员的对齐数中最大的值

4.如果嵌套了结构体,嵌套的结构体对齐原则:他内部最大的成员的整数倍。结构体提总体大小就是所有最大对齐数(含嵌套结构体成员中最大的成员)的整数倍。

三、讲解: 

#include<stdio.h>
struct s1
{            //自身大小  默认对齐数   最终对齐数
	double d;  //   第一个成员没有对齐数
	char c;    // 1         8           1 
	int i;     // 4         8           4
};
struct s2
{            //自身大小  默认对齐数   最终对齐数
	char c1;  //    第一个成员没有对齐数
	struct s1 s1;   //嵌套结构体的成员最大为8 ,对齐数就是8  ,自身大小为16
	char c2; //  1           8           1
};
int main()
{
	struct s2 s;
	printf("%d",sizeof(s));
	return 0;
}

初步来看s变量的大小为  1+7+16+1=25

最终s变量的大小还要是:最大对齐数的整数倍,

而s的成员的最大对齐数是 8,所以应该是8的倍数,

 所以最终s的大小是32

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值