sizeof作用在struct和union上的情况,经典解答

转载学习结构体和union大小的问题 5分钟搞定内存字节对齐转载:http://blog.youkuaiyun.com/hairetz/archive/2009/04/16/4084088.aspx请牢记以下3条原则:(在没有#pragma pack宏的情况下)1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍 阅读详情

请牢记以下3条原则:(在没有#pragma pack宏的情况下)

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
 int id;             //[0]....[3]
 double weight;      //[8].....[15]      原则1
 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2];     //[0],[1]
 int  id;         //[4]...[7]          原则1

 double score;     //[8]....[15]    
 short grade;    //[16],[17]        
 BB b;             //[24]......[47]          原则2
}AA;

int main()
{
  AA a;
  cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
  return 0;
}

结果是

48 24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲#pragma pack().

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为

32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

明白了不?

那#pragma pack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧.

 

 

 

 

===============================================================

一会搞定union内存字节对齐

也是转载一个论坛的回复:

其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:  
  1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;  
  2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int   a[5]为4)不满足整除关系,该最大空间自动延伸;  
   
  我们来看看这段代码:  
  union   mm{  
  char   a;//元长度1  
  int   b[5];//元长度4  
  double   c;//元长度8  
  int   d[3];  
  };  
  本来mm的空间应该是sizeof(int)*5=20;但是如果只是20个单元的话,那可以存几个double型(8位)呢?两个半?当然不可以,所以mm的空间延伸为既要大于20,又要满足其他成员所需空间的整数倍,即24  
   
  所以union的存储空间先看它的成员中哪个占的空间最大,拿他与其他成员的元长度比较,如果可以整除,ok

C语言32个关键字深度解析:从内存模型到编译链接实战 在编程语言中,关键字是构建程序逻辑的基础元素,它们定义了数据类型、控制流程和存储方式等核心概念。理解关键字的底层原理,有助于掌握程序在内存中的布局、编译器的优化行为以及多文件项目的组织方式。从技术价值看,深入理解关键字能帮助开发者编写更高效、更健壮的代码,避免内存错误和未定义行为。在实际应用场景中,无论是嵌入式开发、系统编程还是性能优化,对关键字的精准运用都至关重要。本文聚焦C语言的32个关键字,通过剖析static、extern、const、volatile等热词,结合内存模型和编译链接过程,揭示其在模块 阅读详情

相关推荐

华为OD面试八股文嵌入式C语言基础问题及答案(三)

本文摘要: 本文总结了C/C++编程中的10个核心知识点:1)栈的LIFO特性;2)new/delete与malloc/free在类型安全、异常处理和自动构造/析构上的区别;3)struct与union的内存存储差异;4)memcpy使用时需注意字节计数和边界检查;5)字符串操作函数的安全性问题;6)const与#define在类型检查和内存占用上的区别;7)结构体内存对齐原则及其优化意义;8)strcpy与memcpy在复制内容和方式上的差异;9)递归与循环的选择需考虑效率和问题规模;10)野指针的成因及

m0_50382756的博客 131

计算结构体大小(内存对齐原则)struct、union、class

这篇博客详细的介绍结构体的大小sizeof:union、struct、class。

weixin_51547017的博客 2332

Tessent ICL语法详解:如何高效定义SIB、TDR和TAP模块

本文深入解析Tessent ICL语法,指导如何高效定义SIB、TDR和TAP模块以构建芯片测试网络。通过实战代码示例,详细阐述了各模块的端口声明、接口角色与核心寄存器定义,并提供了顶层集成连接方法与调试技巧,帮助DFT工程师精准描述测试仪器拓扑,提升Tessent工具链使用效率。

silver的专栏 493

union和struct的大小计算

<br />整理自网络。<br /> <br /> <br /><br />规则:<br />1,对于union,对齐的大小是最大的基本元素的对齐大小;对象的大小必须是该基本元素大小的整数倍;<br />2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。<br />3,这里所说的struct和union的对齐,是指其作为其他复杂对象中的元素的时候要求的对

johnnyshao的专栏 1115

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2454

用AI+Playwright实现零代码UI自动化测试:以登录页面为例的实战指南

本文详细介绍了如何利用AI与Playwright结合实现零代码UI自动化测试,特别以登录页面为例进行实战演示。通过自然语言描述生成测试脚本,大幅降低技术门槛,提升测试效率,并支持跨浏览器验证。适合非技术人员快速上手专业级自动化测试。

weixin_28842269的博客 403

联合体union及结构体struct的大小与对齐方式

对齐方式是4或8字节 union: 32位机是以四个字节对齐如 union{long i;int k[5];char c;}  20个字节 64位机8字节或4字节对齐(出现long或double等8字节则8字节对齐) union{long i;int k[5];char c;} 24个字节;union{int i;int k[5];char c;} 20个字节;union{int i;i...

xuxiao_0606的博客 738

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

C语言UNION结构大小的问题

union结构体的大小取决于最大的变量长度。 例如: #include #include using namespace std; union one //返回最大的变量4字节 { int a; char b; }; union two //返回最大的变量1字节 { char a; char b; }; union myt //返回最大的name 16字节

jianghuihong2012的专栏 2226

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5360

微信小程序 - 实现大文件上传分片/切片+本地选择文件上传超大文件,小程序大文件切片上传+断点续传+上传进度条+失败自动重传完整运行示例源码,支持图片、视频、文档各种文件(支持上传单个文件或批量上传)

微信小程序实现大文件上传,实现分片大文件上传,微信小程序 分片 断点续传 大文件上传,微信小程序实现大文件上传 分片上传 进度条,小程序文件分片上传,微信小程序如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,微信小程序实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,微信小程序wx.uploadFile,小程序上传视频,小程序上传文档,实现大文件上传(切片上传)实现大文件上传到服务器教程,支持批量多

🏆 前端领域优质创作者 1万+

C语言中union与struct的区别及sizeof的计算方式

C语言中union与struct的区别 2011-08-02 23:41 45人阅读 评论(0) 收藏 举报     在C语言中结构体和联合具有细微差别,特别是使用sizeof()对其求大小时,许多刚刚接触C语言不久的朋友对此非常困惑,下面我将简单谈以下自

yangyan19870319的专栏 9262

30天入门Python(办公篇)——第34天:pandas - 数据处理与分析利器

摘要 本文介绍了Python数据分析库pandas的核心功能,包括数据结构和基本操作。主要内容涵盖:1) Series和DataFrame两种核心数据结构的创建与使用;2) 多种文件格式的读写方法;3) 数据查看、筛选和清洗技巧;4) 基础统计分析功能;5) 数据透视表和交叉表制作;6) 数据排序与合并等变换操作。文章通过大量代码示例演示了pandas在数据处理各环节的应用,适合作为pandas入门的实践指南,帮助读者快速掌握这一强大工具的基本使用方法。

weixin_42636075的博客 303

C语言struct和union和sizeof关键字

C语言struct、union、sizeof简单的我就不讲了,直接上代码#include &lt;stdio.h&gt; #include &lt;malloc.h&gt; //空的结构占用多少个内存呢(实际gcc编译器不占用内存,bcc和vc编译器编译错误,因为结构体创建之初就是为了集合各种不同变量,但是创建空的结构体就是违背了结构体意图,所以编译错误) struct TS { };...

liuchunjie11的博客 724

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c++ struct union

struct is exactly like class except the default accessibility is public for struct (while it's private for class). http://www.cnblogs.com/xdotnet/archive/2011/04/20/cpp_union.html c+

qq550764107的专栏 771

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c语言 大端小端作用,c语言 union及 大端小端

union 关键字的用法与struct 的用法非常类似。union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下:union StateMachine{char character;int number;char *str;double exp;...

weixin_36408867的博客 301

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

结构体struct union -大端小段

1:大端与小端?与寻常习惯的区别?  大端:高地址存储低位字节。  小端:低地址存储低位字节。  如对于数据0x1234,其32位为0x00001234。  对于大端来说:(地址由低到高存储)00 00 12 34  对于小端来说:(地址由低到高存储)34 12 00 00  由此可以得出结论:大端的存储方式与寻常习惯相一致,而小端的存储方式为按照字节倒排。 在一个64位

wukai0909的博客 1099

C/C++中 struct, union的对齐方式

对齐方式是很多笔试题中常见的试题,是比较喜欢考的一个知识点在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员

chenglian_999的专栏 2182

struct union的一些问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33962923的博客 140

嵌入式开发面试题解答

内存图:相同点:malloc和new都是开辟堆内存空间,free和delete 都是释放堆内存空间不同点:(1)malloc和free是函数,new/delete是操作符(2)malloc开辟空间的时候需要手动计算空间大小,new开辟空间时自动计算空间的大小(3)malloc函数返回值类型为void*,使用时需要强制类型转换,new后面跟的是空间的类型,不需要强制类型转换(4)malloc函数开辟空间的时候没有对空间进行初始化的工作,new开辟空间的时候可以对该空间进行初始化赋值操作。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 804

【C语言】C语言的495个问题

C语言相对低级,其设计理念认为类型大小应该有具体实现来决定, 虽然这很容易出矛盾是的,但其实标准头文件中已经定义了int16_t和uint_32_t类型可以声明多次,但只能定义一次。一般在.c文件中定义,在.h文件·中声明,这样使用者只要引用了.h文件就拥有了声明。变量声明是函数声明是变量定义是int i = 0;函数定义是}尤其是把外部函数的声明放在.h中,而不是.c中,防止外部函数原型变化了,但.c文件中忘记更改导致错误的函数原型贻害无穷。

呆呆的猫的博客 2748

c# union结构体_5年程序员给你总结结构体stru、联合体union、枚举enum,建议收藏...

5年程序员给你总结结构体struct、联合体union、枚举enum要点,本人觉得挺好的,在此分享给大家,希望对大家C语言的学习有帮助:2.1 声明 struct x1 { . . . }; 和 typedef struct { . . . } x2; 有什么不同?2.2 为什么 struct x { . . . }; x thestruct; 不对? 2.3 一个结构可以包含指向自己的指针吗?...

weixin_34677379的博客 187

[笔试面试题] 10-C和C++区别相关

1 C和C++有什么不同? 机制不同:C是面向过程的(但C也可以编写面向对象的程序);C++是面向对象的,提供了类。但是,C++编写面向对象的程序比C容易。 适用领域不同:C适合要求代码体积小的,效率高的场合,如嵌入式;C++适合更上层的,复杂的; 侧重点不同:C语言是结构化编程语言,C++是面向对象编程语言。 C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。 2 C语言中struc...

weixin_30590285的博客 163

c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐

↑点击上方蓝色字体,关注“嵌入式软件实战派”获得更多精品干货。(以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解。)面试官:你知道C语言的结构体对齐吗?应聘者:听说过……平时很少关注……面试官:好吧,那回去等通知吧C语言结构体对齐问题,是面试必备问题。本文,除了用图解的方式讲清楚结构体知识点外,还将为你解答以下问题:为什么会有结构体内存对齐?结构体怎么对齐?学习...

weixin_39640008的博客 358

C语言数据类型详解:从基础到应用实践

数据类型是编程语言中定义数据存储格式与操作方式的基础概念。在C语言中,数据类型系统直接影响内存使用效率、计算精度和程序安全性。整型、浮点型等基本数据类型决定了数值的存储范围和运算规则,而指针、结构体等派生类型则提供了更灵活的内存管理能力。理解数据类型的底层原理对开发高性能、跨平台应用至关重要,特别是在嵌入式系统、金融计算等对精度和效率要求严格的场景中。通过合理选择数据类型和避免常见陷阱(如整数溢出、浮点精度误差),可以显著提升代码质量和运行效率。本文以C语言为例,深入解析数据类型的选择策略与实际工程应用技巧

weixin_33733810的博客 411
上一篇: 判断栈的出栈和入栈序列O(N)时间O(N)空间
下一篇: 递归算法(求n的加法组合,将一个整数拆分成多个整数相加的形式, O(N)时间,O(N)空间)4.0版
C++程序员Carea
博客等级 码龄18年 1590粉丝 878原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值