C语言: sizeof操作符------------求结构体大小

前言

在做题时遇见求结构体大小, 看源码

struct book
{
	char name;
	int id;
	double price;
};

int main()
{
	printf("%d", sizeof(struct book));
	return 0;
}

当时简单的认为输出结果为 1+4+8=13; 结果答案是16, 怎么会这样呢?

计算方法

  1. 首先要了解什么是偏移量

    偏移量指的是结构体变量中成员的地址和结构体变量地址的差。

  2. 结构体大小
    结构体大小等于最后一个成员的偏移量加上最后一个成员的大小

    注意事项:
    a. 存储变量时地址要求对齐
    b. 结构体变量中成员的偏移量必须是成员大小的整数倍
    例如:
    char 偏移量必须为sizeof(char)即1的倍数
    short 偏移量必须为sizeof(short)即2的倍数
    int 偏移量必须为sizeof(int)即4的倍数
    float 偏移量必须为sizeof(float)即4的倍数
    double 偏移量必须为sizeof(double)即8的倍数

    c. 结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数

实例1

struct book
{
	char name;		// 第一个成员name的偏移量为0
	int id;			// 第二个成员id的偏移量是上一个成员的偏移量加上上一个成员的大小:0+1=1,但必须是第二个变量类型长度4的倍数,即1+3=4
	double price;	// 第三个成员price的偏移量是上一个成员的偏移量加上上一个成员的大小: 4+4=8, 这里刚好就是double长度8的倍数(1倍), 即8
					// 最后结构体大小等于最后一个成员的偏移量加上最后一个成员的大小: 8+8=16
					// 另外结构体大小必须是所有成员大小的整数倍,就是所有成员大小的公倍数。
					// 大于等于16, 还要是1,4,8的公倍数

};	
struct book2{
	char name;    //第一个成员name的偏移量为0
	int id;    	  //第二个成员id的偏移量是上一个成员的偏移量加上上一个成员的大小: 0+1=1,但必须是第二个变量类型长度4的倍数,即为1+3=4
	float price;  //第三个成员price的偏移量是上一个成员的偏移量加上上一个成员的大小: 4+4=8,但必须是第三个变量类型长度4的倍数,即为8
	char date;    //第四个成员date的偏移量是上一个成员的偏移量加上上一个成员的大小: 8+4=12,但必须是第四个变量类型长度1的倍数,即为12
				  // 最后结构体大小等于最后一个成员的偏移量加上最后一个成员的大小: 12+1=13
				  //另外结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
				  //大于等于13,还要是1,4,4,1的公倍数 =====> 13+3=16
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值