C语言struct结构体内存

article/2025/10/15 2:24:51

对齐规则:
(i)结构体内 成员存储位置 的起始地址为成员自身长度与默认对齐值 中的较小者的整倍数。
(ii)结构体A嵌套在结构体B内,则A在B内存储位置起始地址为 A内成员最长长度 的整数倍。
(iii)结构体本身的大小为其内成员最长长度的整数倍。ps:若结构体A嵌套在结构体B内(即A是B的成员),则在计算B的大小时,以A内成员的最长长度替换A的长度进行计算。
举例说明:

在VS2013下,默认对齐数为8字节

typedef struct{int a;char b;short c;short d;
}AA_t;

对于变量a,根据规则(i),a的起始位置为0,占用4个字节,0~3。

对于变量b,根据规则(i),b的起始位置为4,占用1个字节。

对于变量c,根据规则(i),c的起始位置为6,占用2个字节,6,7。

对于变量d,根据规则(i),d的起始位置为8,占用2个字节,8,9。

整个结构体AA_t占用内存空间,根据规则(iii),为其内成员最长长度的整数倍,也就是4的整数倍12。

其中5,10,11被填充对齐了。

#pragma pack(4)/*编译选项,表示4字节对齐 平台:VS2013*/struct tagTest1{short a;char d; long b;   long c;   };struct tagTest2{long b;   short c;char d;long a;   };struct tagTest3{short c;long b;char d;   long a;   };

对于tagTest1,a从0开始,占用两个字节的空间,d从2开始,占一个字节,b从4开始,占四个字节,c从8开始,占四个字节,tagTest1的内存大小为12个字节。

对于tagTest2,b从0开始,占四个字节,c从4开始,占两个字节,d从6开始,占一个字节,a从8开始,占四个字节,tagTest2的内存大小为12个字节。。

对于tagTest3,c从0开始,占两个字节,b从4开始,占4个字节,d从9开始,占一个字节,a从12开始,占4个字节,tagTest3的内存大小为16个字节。

若是发现错误,欢迎指正。


http://chatgpt.dhexx.cn/article/XoH83wNY.shtml

相关文章

嵌入式系统开发:C语言中的位结构体

在嵌入式开发中,经常需要表示各种系统状态,位结构体的出现大大方便了我们,尤其是在进行一些硬件层操作和数据通信时。但是在使用位结构体的过程中,是否深入思考一下它的相关属性?是否真正用到它的便利性,来…

keil中,编写结构体成员运算符(.)后不能自动弹出结构体成员

keil中,编写结构体成员运算符(.)后不能自动弹出结构体成员 解决办法: 1、确保源文件里面包含sys.h/stm32f10x.h文件(或者源文件里面的头文件也行) 2、把源文件路径加载到keil里面(魔术棒->C/…

c++中的结构体案例

结构体案例一 案例描述:学生做毕设项目,每名老师有5个学生,总共有3个老师,需求如下: 设计学生和老师的结构体,在老师的结构体中,有老师的姓名和一个存放了5名学生的数组作为成员学生的成员有姓…

C语言:位结构体

位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。 一、位结构—简介 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。 例如在存放一个开关量时,只有0和1 两种状…

C 语言编程 — 构造数据类型 — 结构体(struct)

目录 文章目录 目录结构体声明一个结构体类型定义一个结构体类型的变量定义一个结构体类型的指针变量结构体的成员结构体的内存分布 结构体 结构体(Structure)是一种由不同类型的数据成员组成的数据类型。通过定义结构体,我们可以将多个不同…

C语言结构体和其他构造数据类型详解

结构体和其他构造数据类型 结构体 “结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既然是一种“构造”而成的数据类型,那么说明和使用之前必须先定义它,也就是构造它。 结…

C的实用笔记38——结构体的引入和定义

1.为什么要用结构体? 0、原因:实际开发中,我们需要将不同类型的数据组合成一个整体,这就是结构体。结构体是自创的类型。 1、查找一名学生信息的两种方案:在EXCEL表格和数据库中经常有这种情况,比方说一个…

7.IDA-创建结构体

结构体分类 结构体的一个显著特点在于,结构体中的数据字段是通过名称访问,而不是像数组那样通过索引访问。不好的是,字段名称被编译器转换成了数字偏移量。结果,在反汇编代码清单中,访问结构体字段的方式看起来与使用…

结构体的初步认识以及其内存的计算

目录 前言 结构体的定义 结构体的自引用 结构体的初始化 结构体内存的计算 前言 我们知道,通过不同的数据类型我们可以表达不同意义的数据,如长度宽度面积只需要定义一个 int 类型的数据就可以符合大部分的需求。但是,有些东西自存在就是一…

IDA创建结构体方法

1. ida是最好用的逆向分析工具 2.问题 如果你在使用IDA分析时遇到大量的结构体指针偏移形式的变量,肯定想根据自己的分析重命名结构体各项。 3.定义结构体 这是需要先找到结构体初始化的地方 这里记录了每一项的偏移量,记录了结构体总大小Ox110uLL。 …

手把手教你写单片机的结构体

手把手教你写单片机的结构体 摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运…

STM32基于Flash对结构体读写暨再认识结构体内存分配

目录 前言 认识结构体内存分布 模拟结构体搬运 实现FLASH的结构体读写 前言 记录本篇主要是记录我进行stm32学习中利用stm32的flash(闪存)读写结构体的总结。 认识结构体内存分布 结构体,主要要来存放我们的自定义类型的数据,结…

单片机的结构体

手把手教你写单片机的结构体 FROM8号线攻城狮 公众号 电子信息工程硕士在读,分享单片机、嵌入式linux、物联网等知识,致力于打造最硬核的嵌入式技术公众号。 半碗鸡汤,半碗杂粮。 摘要:听说还有好多学单片机的小伙伴不会用结构…

windows下mysql初始密码设置

转载自:http://blog.csdn.net/ofreelander/article/details/50802780 1.my-default.ini 改名my.ini 在解压的目录下面复制my-default.ini一份改名字为 my.ini。 2.打开 Windows 环境变量设置, 新建变量名 MYSQL_HOME , 变量值为 MySQL 安装目录路径, 在 环境变量 …

MYSQL修改初始化密码的方法

解决方法之一: “ ALTER USER rootlocalhost identified by 123456 ; ” 最近安装了mysql,在使用“ set password for rootlocalhostpassword(123456);”时会遇到 “ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that…

Centos下安装mysql查看初始密码并修改密码

题记:当我们在centos成功安装了mysql后,需要查看初始密码,大概率也需要自己修改密码。 一,查看mysql历时密码 cat var/log/mysqld.log二,进入到mysql mysql -u root -p按回车,然后再password:输入刚才所…

MySQL设置初始密码—注意版本mysql-8.0.30

MySQL设置初始密码—注意版本mysql-8.0.30 第一步:使用管理员模式下的命令行,进入mysql的所在文件下的bin目录; 第二步:输入命令mysql -u root -p; 第三步:这里第一次不用输入密码; 第四步: ALTER USER rootlocalhost…

安装mysql的初始密码在哪里

mysql初始密码是多少 介绍怎么找到mysql安装的root的初始密码 mysql初始密码是多少 介绍怎么找到mysql安装的root的初始密码 怎么给mysql设置用户名和密码 登录数据库 “命令提示字符”窗口录入, 录入cd C:\mysql\bin 并按下回车键,将目录切换为 cd C:\m…

关于MySQL初始化密码忘记的问题

本文章可以解决MySQL密码忘记的问题!!! 1、到mysql安装的bin目录下运行PowerShell 2、在命令行输入 mysql -u root -p 登录 mysql,可以随意输入一个密码,返回”ERROR 1045 (28000): Access denied for user rootlocal…

mysql安装,以及初始化密码

1.首先下载 mysql安装包, 我这里下载的mysql 5.7(免安装版) https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-winx64.zip 然后解压到你自己的目录中,我这里为 D 盘下: 此处,下下来的压缩包里面, data 目…