结构体sizeof问题解惑

C语言sizeof求结构体大小问题汇总 可以说一直被各类结构体大小问题说困扰,花了大半天时间查了一下资料,现在整理汇总一下。 sizeof:C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。 基本数据类型的大小很好计算,我们主要看一下构造数据类型的大小,包括数组,结构体和共用体。 阅读详情

学习编译原理时遇到的习题,结构体的存储空间分配问题。上课时简单讲的对齐原理不足以解决问题,网上搜索后找到了合理解释,经过程序验证觉得可以,记录一下。

原帖地址:https://www.cnblogs.com/bewolf/p/4356903.html

一、为什么结构体计算这么乱?

答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字 节,

短整型(short)数据占两个字节,等等。计算机为了快速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储 在地址能被

4整除的起始位置,字符型数据(char)可以存放在任何地址位置(被1整除),短整型(short)数据存储在地址能被2整除的起始位置。这样字节对齐有助于加快

计算机的取数速度,否则就得多花指令周期了。

二、字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

  2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

说明:
1、基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型;

2、对于复合数据类型,如结构体嵌套结构体,那么基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型;

3、我认为计算结构体大小的时候,主要用到准则2和准则3,对于准则1是编译器自动完成的,不需要过多理会。

4、C++中类的可以看做是特殊的结构体,所以类的sizeof的计算和结构体是一样的。

具体示例和分析见原帖(优快云的代码排版好奇怪跟Typora不太一样)
在这里插入图片描述

在这里插入图片描述
我的示例:
在这里插入图片描述

结合qtdesigner,用pyqtgraph在界面上绘制波形图(一) 思路:先画图,然后在qtdesigner上放一个容器,给这个容器添加一个布局,然后把图当作一个Widget放入布局中。二、PyUIC把test.ui转换成test.py,再新建一个load_test.py写脚本。就这么简单,基础部分就完成了。也可以给它添加样式,我知道的样式不算多,但会继续写。一、随便拖进来一个容器控件,我拖了一个Widget。要想把波形图显示在界面上,核心思想其实很简单。三、load_test.py的代码。 阅读详情

相关推荐

反激开关电源设计全解析:从CCM/DCM原理到PCB布局实战

开关电源作为现代电子设备的能量转换核心,其核心原理是通过高频开关动作实现高效的电能变换。反激拓扑因其结构简单、成本低廉且易于实现电气隔离,成为小功率离线式电源的主流选择。其技术价值在于通过变压器耦合实现能量存储与传递,解决了安全隔离与多路输出等关键需求,广泛应用于充电器、适配器及家电供电等场景。本文聚焦反激电路,深入剖析其CCM与DCM两种工作模式的原理差异及选型考量,并结合伏秒平衡定律与RCD钳位等热词,详解从变压器计算到MOSFET选型的完整工程设计流程。

weixin_31951365的博客 341

sizeof 结构体不准确

c语言代码中,通过sizeof(结构体)时,返回值不准确 解决方法: 在结构体前面加 #pragma pack(1) -> 结构体的边界对齐1字节

雪飞_海 1513

SAP SM30数据维护实战:条件筛选与动态校验的实现技巧

本文详细介绍了SAP SM30数据维护的实战技巧,重点讲解如何通过条件筛选实现精准数据查取,以及利用表维护生成器事件实现动态数据检查与校验。文章提供了从基础视图创建到高级事件编程的完整流程,包括调用函数VIEW_MAINTENANCE_CALL传递筛选条件,以及在NEW_DATA和CHANGE_SAVE事件中编写业务规则校验逻辑,帮助开发者提升SM30的管控能力与数据质量。

q9w8e7r6t5的博客 521

2021-11-28 关于结构体大小不对的问题

关于结构体大小不对的问题

qq_37666407的博客 2483

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

zynq-7000学习笔记(八)——USB摄像头图像采集

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:Zed Board USB摄像头:罗技 C270(720P) linux源码:2016_R1 一、配置linux,支持UVC       如果是中星微的ZC3XX系列的芯片,则要进到GSPCA把ZC3XX的驱动选上

luotong86的专栏 1万+

自定义函数中使用sizeof计算数组长度为啥就不正确了?

在自定义函数中使用sizeof结果为啥不正确?

weixin_63545354的博客 1736

Isograph工具解析:FTA、RBD、FMECA与ETA在可靠性工程中的实战应用

可靠性工程是确保复杂系统安全稳定运行的核心学科,它通过量化方法评估和提升系统在特定条件下的无故障运行能力。其基本原理涉及对系统失效模式、概率及影响进行建模与分析,旨在将定性的工程经验转化为定量的决策依据。在工程实践中,故障树分析(FTA)和可靠性框图(RBD)是两种互为补充的关键技术:FTA采用自上而下的演绎逻辑,追溯导致顶事件发生的所有可能故障组合;RBD则采用自下而上的归纳逻辑,描述系统成功运行所需的功能结构关系。这些分析技术的工程价值在于能够提前识别设计薄弱环节,量化风险,并指导设计优化与维修策略制定

weixin_42522009的博客 315

C语言的sizeof()计算数组参数结果错误

在C语言中我们计算数组大小会使用sizeof(arr)/sizeof(arr[0]) sizeof(arr) : 整个数组占用的字节数; sizeof(arr[0]) : arr[0]占用的字节数; 但是我们有时会遇到这种情况 数组作为参数,求出的数组大小与实际大小不一致。 先看代码 void test(int* arr){ int len=sizeof(arr)/sizeof(arr[0...

博客 1315

Unity IAP插件实战:从零搭建Google Play内购系统

本文详细介绍了如何使用Unity IAP插件从零搭建Google Play内购系统,涵盖环境准备、双端配置、核心API实现及常见问题排查。通过实战代码示例,帮助开发者快速掌握跨平台内购功能开发,提升手游商业化效率。

weixin_28692867的博客 430

Fiddler everywhere的一些基础操作

网上能搜到的Fiddler everywhere使用教程太少,于是我整理了一些自己实操成功的内容,包括Fiddler everywhere的Mock测试、弱网测试等基础操作,后续还会持续更新。操作系统:macOS使用工具:Fiddler everywhere 5.10.0本文简单介绍了使用Fiddler everywhere进行的Mock测试和弱网测试,而Fiddler everywhere提供了更多的其他实用的功能,我会在后期进行一个持续的学习和更新。

weixin_44346646的博客 2478

关于sizeof与#pragma pack

对于结构体,在使用sizeof的时候会进行字节的对齐,对齐的规则如下: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加...

weixin_30614587的博客 249

Open3D 计算点云法向量的夹角【2026最新版】

计算法向量的夹角,博客长期更新,本文最新更新时间为:2026年3月7日。

点云侠的博客 3130

C语言每日一练(4)sizeof使用常见的两个问题(sizeof(结构体)以及数组传参之后sizeof的问题)

*sizeof使用过程中的两个重要点: *1、sizeof(structs) *要点是对齐的问题,以及要深入理解#pragmapack(n); *默认的#pragmapack(n),n=8; *当结构体的成员变量的长度>n时,使用n进行字节对齐 *当结构的成员变量的长度<n时,使用自身默认的字节对齐 * 结构体的总长度应该为n的整数倍,如果不是,要进行补齐操作 *例如: *...

mankaichuang的博客 827

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C/C++ 彻底解决结构体的sizeof问题

原文地址:C/C++ 彻底解决结构体的sizeof问题 引言 相信在大多数人开始学习编程时,老师都会谈到各种数据类型的size问题。比如说一个int类型的变量大小是4byte,一个char类型的变量是1byte。这些问题都很好解决,但是当谈到一个结构体的大小时,答案往往就不那么肯定了。这个问题我困惑了很久,查找了不少资料后终于有所体会。现在特意记录下来,谈一谈计算机中各种数据类型的size到底是...

piglite的专栏 1331

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

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

sizeof 结构体问题

口诀:yue struct stru3 { char i; //start address is 0 int m; //start address is 4 char n; //start address is 8 }; struct stru4 { char i; //start address is 0 char n; //start address is 1 int m; //...

qq_37061368的博客 886

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言大小问题,C语言sizeof求结构体大小问题汇总

可以说一直被各类结构体大小问题所困扰,花了大半天时间查了一下资料,现在整理汇总如下。sizeof:C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。基本数据类型的大小很好计算,我们主要看一下构造数据类型的大小,包括数组,结构体和共用体。1、数组类型,计算单个元素的大小,整个数组大小就是单个元素大小乘以元素个数。char a[] =...

weixin_42139460的博客 912

C/C++ sizeof用法以及结构体占用内存大小问题

参考链接:https://www.jb51.net/article/136259.htm sizeof用法 1.它是什么? 2.可不可以跟变量名,其调用方式是什么样的? 3.C语言中sizeof函数的基本使用总结 4.C/C++ 中sizeof(‘a’)的值对比? 5.答案是什么?为什么? int i; i = 10; printf("%d\n", i); printf("%d...

郑丹丹的博客 799

C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

asdfgh0077的博客 129

结构体sizeof的问题

要想正确计算sizeof(结构体)的大小,须理解数据对齐的概念。 数据对齐分为自然对齐和强制对齐两种方式。 自然对齐,即其内存地址必须是其类型本身的整数倍。结构体对齐到其中成员最大长度类型的整数倍。 自然对齐应该遵循如下两条规则:1、数据成员对齐规则:在默认情况下,各成员变量存放的起始地址相对于结构的起始地址的偏移量:sizeof(类型)或其倍数。 2、整体对齐规则。结构的总大小也有个约束...

weixin_30677475的博客 71

sizeof求结构体大小的问题

sizeof求解结构体大小的问题标签(空格分隔):c/c++具体见:http://www.cnblogs.com/0201zcr/p/4789332.html?utm_source=tuicool&utm_medium=referral sizeof求解结构体大小的问题  如何给结构体变量分配空间由编译器决定,下面的情况针对的是Linux下的GCC。在Windows下的VC平台也是这样,至于其他平台

hust_sheng的专栏 6429

【C++】sizeof和strlen的区别,尤其注意sizeof在结构体中的内存对齐问题

【C++】sizeof和strlen的区别,尤其注意sizeof在结构体中的内存对齐问题

m0_48086806的博客 190

基于结构体sizeof的字节对齐问题讨论

这些天经常在论坛上看到有人问关于结构体的sizeof的问题,要解答这个问题,首先就必须要了解字节对齐的问题。下面就对此部分内容做一个简要的小结,方便以后查阅。(部分内容参考网上的资料,如有错误请读者指正)。首先我写了如下一段计算结构体大小的代码,测试一下我们所知道的理论是否和实际相同。#include using namespace std;//设置为向

delphiwcdj的专栏 1963

zz结构体的sizeof 问题以及如何求每个元素的偏移量

struct S1{char c;int i;};问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗你在你机器上试过了吗也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。Why为什么受伤的总是我请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来

sunskyor的专栏 1315
上一篇: python学习——jupyter notebook一些奇怪的故障(汇总)
下一篇: 段错误(Segment Fault)
Mer_chen
博客等级 码龄8年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值