C语言中结构体大小计算即存储分配

大话C语言:第42篇 结构体内存分配原则 每一个元素存入内存时,都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。vc6.0和Visual Studio环境下,8字节对齐,即存放double型变量的起始地址,必须是8的倍数,double变量占8字节。在64位系统下,以8字节为单位开辟内存。long int 在32位平台下,4字节对齐 ,即存放long int 型的变量,起始内存单元的编号是4的倍数即可。gcc环境下,4字节对齐,即存放double型变量的起始地址,必须是4的倍数,double变量占8字节。 阅读详情

C语言中结构体大小计算即存储分配

C语言中常用预定义的数据类型:

类型:         char short int long float double (long double)

大小(字节数):

  gcc3.2.2: 1      2    4   4     4     8      12

  Visual C++:1      2    4   4     4     8      8

ARM架构下被访问的变量大小形式可以为32位(字)、16位(半字)、8位(字节),当然,还有bit原子位操作。

typedef signed long  s32;
typedef signed short s16;
typedef signed char  s8;

typedef unsigned long  u32;
typedef unsigned short u16;
typedef unsigned char  u8;

定义一个结构体类型的时候(这里是定义结构体类型struct StrucTypeDef,不是定义一个结构体变量struct StrucTypeDef stru1或者结构体指针struct StrucTypeDef *stru2)并没有分配实际的地址空间(定义结构体变量在编译链接过程中给了实际地址,而结构体指针要显式的用malloc等形式申请栈内地址),通俗的说就是定义类型是没有实际分配空间的,而定义变量的时候会分配空间。

以下内容编辑前转自http://blog.youkuaiyun.com/lichunming83/archive/2009/10/31/4752818.aspx

Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:

1) 结构体变量的首地址是其最长基本类型成员的整数倍;

备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能是该基本数据类型的整倍的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。

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

备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。

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

备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。

 4) 结构体内类型相同的连续元素将在连续的空间内,和数组一样。

5) 如果结构体内存在长度大于处理器位数的元素,那么就以处理器的倍数为对齐单位;否则,如果结构体内的元素的长度都小于处理器的倍数的时候,便以结构体里面最长的数据元素为对齐单位。

 

以下内容编辑前转自http://www.dzsc.com/data/html/2009-6-4/76676.html

运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。

  C语言中的构造数据类型有三种:数组、结构体和共用体。

  数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。

  结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的一个结构体:

  struct stu1

  {

  int i;

  char c;

  int j;

  };

  先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址 的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏 移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成 员的大小(4+1),其值为5。

  实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。

  对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。

  对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。

  再看一个满足第一条,不满足第二条的情况

  struct stu2

  {

  int k;

  short t;

  };

  成员k的偏移量为0;成员t的偏移量为4,都不需要调整。但计算出来的大小为6,显然不 是成员k大小的整数倍。因此,编译器会在成员t后面补上2个字节,使得结构体的大小变成8从而满足第二个要求。由此可见,大家在定义结构体类型时需要考虑 到字节对齐的情况,不同的顺序会影响到结构体的大小。对比下面两种定义顺序

  struct stu3

  {

  char c1;

  int i;

  char c2;

  }

  struct stu4

  {

  char c1;

  char c2;

  int i;

  }

  虽然结构体stu3和stu4中成员都一样,但sizeof(struct stu3)的值为12而sizeof(struct stu4)的值为8。

  如果结构体中的成员又是另外一种结构体类型时应该怎么计算呢?只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。看下面的例子:

  struct stu5

  {

  short i;

  struct

  {

  char c;

  int j;

  } ss;

  int k;

  }

  结构体stu5的成员ss.c的偏移量应该是4,而不是2。整个结构体大小应该是16。

  如何给结构体变量分配空间由编译器决定,以上情况针对的是Linux下的GCC。其他平台的C编译器可能会有不同的处理。


实例讲解结构体和共用体内存分配机制 1.了解结构体和共用体 结构体: C 结构体 共用体:C 共用体 为什么内存分配时需要对其: 对其原因 2.结构体存储规则 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量都是基本类型成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;(如下图目标空间成员与首地址的偏移量为4+首地址大小) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节 3.共用体存储规则 1)共用体的总大小为共用体最宽基本类 阅读详情

相关推荐

Palantir的本体论建模跟数仓建模的异同

Palantir的Foundry Ontology通过构建组织的数字孪生体,将数据集和模型映射为对象类型、属性、链接和操作类型,形成完整的语义知识网络。与传统数仓建模相比,本体建模以业务问题为驱动,强调细粒度语义和实时决策能力,采用图语义技术实现灵活的映射关系。

轩哥的个人研究和成长记录 1595

[转]关于结构体内存

C语言中常用预定义的数据类型: 类型: char short int long float double (long double) 大小(字节数):   gcc3.2.2: 1 2 4 4 4 8 12   Visual C++:1 2 4 4 4 8 8 ARM架构下被访问的变...

我的ACM空间 294

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 223

嵌入式C-1

1)2进制、8进制、16进制的相互转换 1.进制的概念(只是一种计数的方法) 2.进制的转换 (1)2进制转换成16进制 2进制:0B 16进制:0X 通过8421码计算 例子: 方法1.通过8421码,先算2进制转换成10进制,再转换成16进制 注:不够四位的添0 方法2:电脑自带的计算器,程序员模式 HEX:16进制 DEC:10进制 OCT:8进制 BIN:2进制 (2)10进制转换成其他进制 原则:转成几进制就除几,余...

qq_52382474的博客 787

6、业务影响分析(BIA)的数据收集与关键指标评估

本文全面解析了业务影响分析(BIA)的核心内容,包括数据收集、业务流程分析、信息系统与资产清单、人员与供应商依赖、影响声明、关键指标评估(如MTD、RTO、RPO)、威胁建模与风险分析等。通过详细的介绍和图表展示,帮助组织系统性地制定灾难恢复计划,以应对各种潜在风险,确保关键业务流程在灾难发生后能够快速恢复并持续运营。

moss5的博客 374

QQ也能连接OpenClaw啦!手机QQ远程操控本地AI保姆级教程

2026年最新OpenClaw与QQ连接教程发布,支持手机远程操控本地AI。腾讯官方推出QQ Bot插件,无需服务器即可实现三步绑定。教程提供三种连接方案:新手首选的扫码连接(10分钟搞定)、稳定的QQ群机器人方案,以及公网接入方案。详细步骤包括版本更新、插件安装、扫码绑定和功能测试,并附常见问题解决方案。该功能让用户通过QQ指令即可实现文件整理、文档生成等电脑操作,真正实现"手机发指令,电脑自动干"。

通俗易懂学IT 592

一文读懂C/C++ 结构体内存分配原则

C语言struct结构体极大的扩充了数据类型,其实就相当于C++中的类,C++为了保存对C的兼容也保留了结构体这个数据类型,不过一般C++中结构体都只有数据没有方法。 但是C/C++中结构体在内存中的大小是如何确定的呢? 其实 结构体在内存中的大小由以下两个规则确定; 1、当前总大小是下一个数据类型的整数倍(如果不满足则补齐,但是单字节最大补齐4/8位具体由当前所有单字节数据类型中最大的数据...

baihebeijixing的专栏 1702

【AI面试】2026 AI Agent 应用开发|应届生简历模板 + 完整学习路线图(校招可直接复用)

很多同学学完 RAG、Agent 之后,不知道简历怎么写,项目写成 “调用大模型 API 实现聊天机器人”,投出去几乎没有面试。AI Agent 应用开发,本质还是软件开发岗位。简历要突出工程能力、踩坑优化、问题解决,不要只堆砌 AI 关键词。注意:本文针对【AI 应用开发 / Agent 应用工程师】本科校招;不适合大模型训练、微调算法岗。AI Agent 应用开发岗位,不是只会写提示词、调用 API 就可以拿到 offer。拥有传统软件工程基本功,同时懂大模型、RAG、Agent 工程落地的开发者。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 303

C语言中struct结构体中的内存如何分配

然后是double c 内存是8, 所以刚好。最后看整体内存为16是最大double(8)的倍数,所以不需要扩内存。2.struct整体的内存是里面最大内存成员的整数倍。而我写的,首先是char a 占一个内存,int b ,1不是4的倍数,所以到偏移量为4的地方存储。首先,它的原则是1.所在位置的偏移量(即我写的红色数字)是sizeof(类型)的整数倍。我们先来看一段代码;

Qianxueban的博客 635

YOLO26涨点改进 | 独家创新,特殊场景检测篇 | TGRS 2025 | 引入FAENet特征自适应增强网络,专注于恶劣天气条件下的目标检测(低光场景、雾天场景、雨雪场景、复杂环境等)即插即用

🔥本文提出了一种名为FAENet的特征自适应增强网络,可有效提升YOLO26在恶劣天气条件下的目标检测性能。FAENet通过拉普拉斯金字塔分解思想,将输入特征分为低频和高频两部分进行针对性增强:低频分支强化全局轮廓,高频分支增强边缘纹理细节。该模块设计轻量、可端到端训练,在不改变原始图像分布的前提下,显著缓解雾霾、低照度等复杂环境造成的特征退化问题。实验表明,该方法在多个恶劣天气数据集上超越了当前最优检测器,同时保持了轻量级和高速度特性。

Ai缝合怪、助力小伙伴高效发论文 334

【Unity】NGUI下载与导入

Unity3D插件NGUI的下载和导入。

Get your hands dirty 3万+

C语言中结构体内存分配(内含数组与结构体版)----超级详细版

在网上看资料了很久,看的我头晕都没看懂,不如自己操作一遍,总结出来了经验。 首先我们要理解这几个概念: 1) 结构体变量的首地址是其最长基本类型成员的整数倍; 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3) 结构体的总大小为结构体最宽基本类型成员大小的 整数 倍,如有需要,编译器会...

山月藏匿浪漫、 1万+

C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理)

环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2067

C语言中结构体大小计算即存储分配(转载)

C语言中常用预定义的数据类型: 类型:         char short int long float double (long double) 大小(字节数):   gcc3.2.2: 1      2    4   4     4     8      12   Visual C++:1      2    4   4     4     8      8 ARM架构下被访问的变

PengPengQian的博客 800

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

结构体的内存存储细节

// // main.c // C语言学习 #include int main(int argc, const char * argv[]) { /* 数组内存寻址是从大到小 存储数组元素从小到大 数组的地址就是数组首元素的地址 */ int nums[3] = {1,3,5}; //定义结构

763

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言-自定义类型(结构体、枚举、联合)如此简单

本文详细介绍了自定义类型中结构体、位段、枚举、联合体等内容,包括它们如何声明、定义以及在内存中如何布局,通过此篇的学习会对有关自定义类型相关知识深入了解。

熬夜秃顶中...... 1019

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言 结构体存储空间分配

这两天在看结构体,一直在琢磨结构体的存储空间分配的问题,琢磨了半天总算明白了。和大家分享一下,希望能有所帮助。相信大家都知道结构体里元素存储要对齐吧,话虽是没错,只是这个“对齐”里面包含了很多微妙的东西。首先详细的给出结构体内存存储空间分配的原则吧:编译器按照成员列表顺序一个接一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间...

Andy_Xu2014的博客 1680

C语言结构体对齐问题详解

C语言结构体对齐问题详解 测试环境32位机 WinXP: 编译器VC6(MS cl.exe ) 和 mingw32-gcc-4.5.2   1 结构体数据对齐(没有#pragma pack()宏定义) 结构体对齐可以总结为三个基本原则 ①数据成员对齐规则: 结构体的数据成员中,第一个成员从offset为0的地址开始,以后每一个成员存储的起始位置为该成员大小

YUAN1125的专栏 1139

C中结构体的存储分配

转载链接 对于C语言中结构体所占的存储空间的大小,也一直是笔试面试的常客,今天好好看了一下这方面,以前一直以为很清楚了,今天通过各种实际测试举例,发现原来还是没有搞透彻,好在现在是彻底懂了,所以和大家分享,希望能有所帮助。 提到结构体,相信大家都知道元素存储要对齐,话是没有错,只是这个“对齐”里面包含了很多微妙的东西。首先详细的给出结构体内存分配的原则吧:编译器按照成员列表顺序一个

CHANGQINGTENGCJM的专栏 500

C - 结构体内存分配

最近又捡起了C语言,遇到了大量对结构体操作的业务,在操作期间,发现对结构体在内存中的分配仍然存有一定的疑问。,经过学习,特把有关结构体内存分配的相关知识记录下来。 内存对齐:要了解结构体的内存分配,首先需要了解内存对齐的概念。之所以会有内存对齐的概念,是因为,在操作系统中,数据的存放时按照字节存放的,而结构体又不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限...

bailang_zhizun的博客 1万+

揭秘结构体内存对齐与位段存储

【摘要】本文介绍了结构体内存对齐和位段存储的规则与应用。结构体存储遵循特定对齐规则,成员变量需按对齐数整数倍地址存放,导致实际占用空间可能大于成员尺寸之和。位段通过bit位精确控制成员存储空间,但存在内存分配不确定性和跨平台限制。文章通过代码示例演示了结构体S1、S2、S3、S4的内存计算过程,以及位段A的存储方式,并指出位段操作的特殊注意事项,如不能直接使用地址运算符。最后解析了练习代码的内存布局,说明空白部分为内存浪费区域。

2401_86525813的博客 1347

【C】自定义类型总结(结构体、联合体、枚举)

🍁这篇博客介绍自定义类型,包含结构体、联合体、枚举;结构体部分的知识点尤为重要!

trong_ 的烂笔头 654

C语言笔记----2012年计算机联考真题

C语言笔记【2】 【2012年计算机联考真题】 某计算机存储器按字节编址,采用小端方式存放数据,假定编译器规定int和short型长度分别为32位和16位,并且数据按边界对齐存储,其C语言程序段如下: struct{ int a; char b; short c; }record; record.a=273; 若record变量的首地址为0xC008,则地址0xC008中的内容及record.c的地址分别为( ) A . 0x00 0xC00D B . 0x00 0xC00E C . 0x11 0x

娄零的博客 1万+
上一篇: latch和lock的区别
下一篇: 百度面经
Zhangjay
博客等级 码龄19年 20粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值