栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
};

	
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510773.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号