C语言的sizeof运算符计算结构体大小
C语言的sizeof运算符运算规则
sizeof运算符
**sizeof 是一个运算符,不是函数(方法)。**
例子:
当想打印一个变量的存储区域大小时,可以直接写
int a = 5;
printf("%d\n",sizeof a);
当想打印一个数据类型的存储区域大小时,因为int是数据类型,所以要加小括号提高int的运算优先级
printf("%d\n",sizeof(int));
C中不同数据类型所占用的内存大小
对于32位系统来说,大小如下(单位:字节)
sizeof计算结构体大小
- 结构体的成员可以是不同的数据类型,成员被声明后顺序存放在一块连续的内存区域。
- 结构体的大小不是简单的相加,需要考虑系统在存储结构体时的数据对齐。
- 需要引入一个概念:偏移量。
偏移量指的是结构体变量中成员的地址和结构体变量地址的差
- 结构体首个数据的偏移量为0。
- 结构体后一个成员的偏移量 = 前一个成员的偏移量+补充字节+成员大小
- 结构体大小等于最后一个成员大小加上偏移量
例子:
struct aa{int a;char c;int b;};printf("%d\n",sizeof(struct aa));
答案是:12
偏移量 | 补充字节 | 成员大小 |
---|---|---|
0 | 0 | 4 |
4 | 0 | 1 |
5 | 3 | 4 |
偏移量5+3=8 结构体大小8+4=12
在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:
(1)结构体变量中成员的偏移量必须是成员数据类型大小的整数倍(0被认为是任何数的整数倍)
(2)结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
第一个成员a的偏移量是0,第二个成员c的偏移量是0+0+4=4,因为成员大小是1,所以不需要补充字节。第三个成员b的偏移量是4+0+1=5,因为成员大小是4,遵循原则(1),需要3个补充字节,偏移量就是5+3=8,结构体大小即8+4=12。12遵循了原则(2),所以正确。
sizeof计算结构体中存放数组
举例:
struct aa{int a;char c[6];int b;};printf("%d\n",sizeof(struct aa));
答案是16。第二个成员c的偏移量是0+0+4=4,不需要补充字节,因为4是char的整数倍;成员b的大小是4,所以需要连个补充字节,偏移量即是10+2=12,得出结构体大小是12+4=16
sizeof计算结构体中存放结构体
嵌套结构体存放,需要展开计算
(1)第二个成员的偏移量为展开的成员中,最大的成员(数据类型占字节最大)的整数倍。
(2)结构体的大小,是展开后所有成员的整数倍
注意:必须展开,嵌入的结构体不能当成一个整体成员计算。
举例:
struct aa{int a;char c[3];struct bb{int e[5];double f[2];};int b;};printf("%d\n",sizeof(struct aa));//打印答案是:56
- 可以看到结构体中int e[5]的成员最大,因为要展开,所以是成员f最大,不是e(可以回看上面存放数组sizeof理解)
- 因为展开后f最大,所以结构体aa.c的偏移量是8(对照原则(1))
- 因为结构体大小是所有成员的整数倍,所以结构体aa的大小是56,否则是52。(对照原则(2))
偏移量 | 补充字节 | 成员大小 |
---|---|---|
0 | 0 | 4 |
4 | 4 | 3 |
12 | 0 | 20 |
32 | 0 | 16 |
48 | 0 | 4 |
48+0+4=52,结构体大小必须是展开后所有成员大小的整数倍(数据对齐),所以52+4=56。
sizeof计算结构体中存放联合体(共用体)union
什么是联合体?
- 联合体也叫共用体,在C语言中定义联合体的关键字是union
- 联合体的所有成员在内存中具有相同的首地址,共占同一段内存空间,这些成员可以相互覆盖,因此联合体也常常被称作共用体,在不同的时间保存不同的数据类型和不同长度的成员的值。也就是说,在某一时刻,只有最新存储的成员是有效的。运用此种类型数据的优点是节省存储空间。
所以计算结构体中嵌套的共用体时,不管最新存储了哪个成员,占用的内存空间不会超过共用体里面定义的最大成员占用的最大空间。
sizeof计算结构体中存放联合体(共用体)union的计算原则,和sizeof计算结构体中存放结构体一样,都需要展开,并对照那两条原则去计算。区别就是共用体的成员大小只需要计算最大的。
举例:
struct aa{int m1;char m2;float m3;union uu{char u1[5];int u2[2];}ua;}myaa;printf("%d\n",sizeof(struct aa));//打印答案是:20
对照原则,展开成员后计算。结构体aa.m2的偏移量是4,结构体aa的sizeof是20
偏移量 | 补充字节 | 成员大小 |
---|---|---|
0 | 0 | 4 |
4 | 0 | 1 |
5 | 3 | 4 |
12 | 0 | 8 |
C语言的sizeof运算符计算结构体大小相关推荐
- C++ sizeof(struct)计算结构体大小
一.sizeof() 在学习C++的时候会学到一个sizeof操作符,在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符.单位是位(byte). 我们都知道char.short ...
- c++中利用sizeof运算符计算结构体大小问题探讨
c++中提供的sizeof运算符可以方便得计算出内置类型的字节数大小,比如sizeof(int),sizeof(char),sizeof(double)的返回值分别为4,1,8,这是很容易理解的.但是 ...
- C语言 计算结构体大小
本文主要参考:结构体内存对齐(如何计算结构体的大小) 前言 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数. 结构体中的成员可以是不同的数据类型, ...
- 使用sizeof()计算结构体大小
下面代码的输出结果是: #include <iostream> using namespace std; #pragma pack(4) struct T{ char a; short b ...
- c语言 位域 sizeof,含位域结构体的sizeof
使用位域的主要目的是压缩存储,其大致规则为: 1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止: 2) 如果相邻位域字段的类 ...
- 结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小
结构体计算要遵循字节对齐原则 结构体默认的字节对齐一般满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是 ...
- sizeof运算求结构体大小
首先有几条规则: 1. 结构体的成员相对于结构体的偏移量,是该成员所包含的最大简单类型(指占用内存数)的整数倍(如果该成员本身又是一个结构体,就要递归查找其简单类型,简单类型就是char short ...
- 结构体struct及计算结构体大小
目录 1.结构体类型的声明 2. 用结构体类型来创建结构体变量并初始化 3.结构体的嵌套使用 4.结构体传参 5. 结构体成员的访问 1.结构体类型的声明 结构是一些值的集合,这些值称为成员变量.结 ...
- 结构体PLUS(计算结构体类型大小及位段)~~
如何计算结构体类型大小呢? 1. 结构体内存对齐 为什么要内存对齐呢? 2.修改默认对齐数 3.位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 关于结构体类型,之前阿涛写过一篇文章,里 ...
最新文章
- Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)
- 单张GPU搞定GPT-3超参数!先训练小模型,再“一键迁移” | 已开源
- java中的几个概念的比较
- DWR重温 DWE例子 如下
- 用安卓虚拟机运行程序时程序停止_程序运行时Trace:DynamoRIO Tool
- MVC中使用 事物
- Application log debug - storage
- WPF 修改(优化)Menu菜单的样式
- 用Python创建漂亮的交互式可视化效果
- 高通量数据中批次效应的鉴定和处理(二)
- 开源界也要注意,Apache 基金会与 GitHub 都受美国法律约束
- Assimp Android 编译
- 简述linux命令的,简述linux系统以及一些简单的命令
- 泛微协同办公平台E-cology8.0版本后台维护手册--组织权限中心
- Pycharm打开已有项目配置python环境
- FI-SAP财务成本知识点汇总
- js操作元素相关案例
- ST17H66 低功耗蓝牙SOC开发(3)—— OSAL系统简介
- GoogLeNet:《Going deeper with convolutions》论文详解
- Java性能优化学习2:性能优化切入点(上)
热门文章
- 35岁,成就寥寥,为时已晚?(I am 35 and I haven't achieved much in life. Is it too late?)...
- Leetcode1189. “气球” 的最大数量(C++思路与代码)
- angular7上传表格文件并展示在页面
- 图片验证码反爬解决思路
- 收银系统(Java简单版)
- 网页在线视频只有声音没有图像
- dbms chapter3
- (最新react-native-0.59.5) 如何将ReactNative项目集成到现有得Android项目中(两种实现方法之一)
- 促销drools_规则引擎在促销管理系统中的研究及应用(华东理工大学2010年度硕士学位论文)...
- python半径为2.11的圆球的体积_python数据分析第二版(11),利用,Python,进行,复现,十一...