详细解释如何计算一个结构体的大小?
其他:
1.数组下标可为负:a[-1] 相当于 a+(-1);
2.联合体大小就是成员中最大类型的大小;
如何计算一个结构体的大小?
例如:
struct Test{
int Num;
char *name;//指针大小取决于编译器的位数 ,64位 为:8字节 32位为:4字节
short date;
char ch;
}*p;
总结计算大小规则:
1.其大小也与成员顺序有关系,因为前一个成员地址需要与下一个成员地址构成需要满足地址对齐,即当前所占字节数需为当前编译器宽度的整数倍
如以上结构体(假设编译器为64位):int num 占4字节,下一成员char * name 占用8字节
首先4+8=12>8,即编译器宽度(即指针所占大小:8)存放不下,故第一个成员补全为编译器宽度为8字节,(需保持和下一成员地址对齐,如果当前几个数据成员地址实现对齐,则从下一个成员为起点再重复以上规则))
接下来:short date 占用2字节,char ch 占用1字节 2+1=3字节,一个地址宽度能放下,但8+8+3=19不是8的倍数,故需要补齐,其实就是再补5个字节,故此结构体大小为:24字节
注意:如何补?补几个字节,取决于编译器宽度,和其中占用内存大小最大的成员,如过超过编译器宽度,以其数据成员所占内存大小为对齐基准,否则补齐到编译器宽度即可
- 再举个例子:
struct Test{//int Num;//char *name;//指针大小取决于编译器的位数 ,64位 为:8字节 32位为:4字节short date;char ch;}*p;
以上结构体多大呢? 答案:4字节 (没有达到编译器宽度,以最大成员对齐)
再来个例子:
struct Test{ int Num;char *name;//指针大小取决于编译器的位数 ,64位 为:8字节 32位为:4字节short date;char ch; int ch1; //char k; }TEST;
答案:24 每对其一次,从当前开始对齐,小于编译器宽度以当前 最大元素对齐
8: 4+补齐4
8:8(4+8=12 >8,但不是8倍数,故上面元素需补齐4)
8:2+1+补齐1 + 4
总和:刚好24 不用再补齐
详细解释如何计算一个结构体的大小?相关推荐
- 如何判断一个结构体的大小
对于嵌入式系统来说,内存很宝贵,那么在编程的时候就要尽量使自己用的数据结构所用的内存少,而结构体是C编程中经常用到的结构,保证结构体大小尽量的合理是很重要的.下面说一下如何判断一个结构体的大小. 首先 ...
- 结构体的大小如何计算?
看了一些博客上关于结构体计算的讲法,有些没讲全面,有些根本就是错误的,可能作者本人都没意识到自己错了,我总结一下加深印象. 查看全文 http://www.taodudu.cc/news/show-7 ...
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...
- C语言 如何计算结构体的大小
无嵌套结构体的大小计算 如何计算结构体的大小? 由于存储变量地址对齐的问题,计算结构体大小的3条规则: 1.结构体变量的首地址,必须是结构体变量中的"最大基本数据类型成员所占字节数" ...
- 如何计算结构体的大小(四步轻松解决)
我们都知道,利用sizeof可以直接计算得出,那么具体是如何得出这些答案的呢,我将通过代码和四步规则法结合来做演示,如下述代码所示: #include<stdio.h> typedef s ...
- 结构体的大小该如何计算?
1. 第一个成员在与结构体变量偏移量为 0 的地址处. 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处. 对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值 . VS 中默认的 ...
- 结构体的大小如何计算
我们实际生活中,保存的数据一般不会是同一种类型,所以引入了结构体.而结构体的大小也不是成员类型大小的简单相加.需要考虑到系统在存储结构体变量时的地址对齐问题. 由于存储变量地址对齐的问题,结构体大小计 ...
- 第10章结构体01——结构体字节大小的计算
1.该篇笔记详见C提高笔记(传智播客) 文章目录 博文01:(常考面试题) 三步解决C语言中struct字节对齐问题,结构体的字节大小问题 第1步.先确定结构体实际对齐单位, 第2步.除结构体的第一个 ...
- 结构体PLUS(计算结构体类型大小及位段)~~
如何计算结构体类型大小呢? 1. 结构体内存对齐 为什么要内存对齐呢? 2.修改默认对齐数 3.位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 关于结构体类型,之前阿涛写过一篇文章,里 ...
最新文章
- Java正则表达式--Matcher.group函数的用法
- Oracle 数据库常用操作语句大全
- 那些在家啃书自学的人,最后都找到工作了吗?
- 浅析epoll – epoll函数深入讲解
- 解决Pytohn安装第三方库出现read timed out 问题
- 研究Java 9 Money and Currency API(JSR 354)
- nyoj239 月老的难题 二分图 匈牙利算法
- 解决压缩包跨平台解压缩的中文乱码问题
- C++/C--动态二维数组的内存分配与释放【转载】
- 独自封装windows 10系统教程(全)
- 一次破解TP-Link WAR308路由器的经历(2)
- 泛函分析 04.05 有界线性算子 - 闭算子与闭图像定理
- 分布式机器学习(一)之总体概述
- 【题解:洛谷4186||USACO18JAN Cow at Large G】
- 小学生遭校长拳击内脏出血 求医救命钱遭抢(图)
- 益智java单词游戏_java实现单词搜索迷宫游戏
- 吴恩达 深度学习 序列模型 第一周 编程作业二 字符级别语言模型项目 总结
- 数据挖掘十大经典算法,你都知道哪些?
- 手把手教你如何绘制一辆,“单身自行车”,哈哈哈!
- Android Binder机制浅析及AIDL的使用