c语言结构体数据对齐问题

C语言memset()函数详解 传递时,每个字节都将被设置为该值的低字节。如果要给整型数组赋值,建议使用循环遍历数组并逐个为数组元素赋值的方式,以确保每个数组元素都被正确设置。通过指定要设置的值,可以灵活地将其应用于不同类型的数据结构和内存块。函数时要保证操作的内存块有效并且足够大,以避免访问非法内存区域或导致缓冲区溢出等问题。是一个 C 语言中的库函数,用于将指定的内存块设置为指定的值。函数的主要功能是将指定的内存块的每个字节设置为给定的值。需要注意的是,我们传递的是结构体变量的地址(的所有元素设置为 0。的所有元素设置为 10。 阅读详情

问题描述:在开发过程中,构建了一个结构体,然后将结构体保存到flash芯片中,读取出来的时候数据内容和存进去的不一样(STM32F103芯片)

问题所在:构建结构体的时候,没有注意到结构体数据的对齐问题,计算错了结构体的大小

详细说明:

没有进行对齐的结构体内容如下:

根据结构体的内容,按照常规的计算方式,那么这个结构体的大小是32个字节,所以我写到flash里边的时候,写入长度就给了32个字节的长度。

struct BOX_STATE
{
  u32 box_password; //4字节
  u16 temperature;//2字节
  u16 humidity;//2字节
  u8 lock_state;//1字节
  u8 use_state ;//1字节
  uint64_t waybill_num;//8字节
  uint64_t phone_num;//8字节
  u32 obligate;//4字节
  u16 obligate1; //2字节
};
//给结构体赋值,查看内存情况

memset(&a_box,0xAA,sizeof(a_box));//初始化这个结构体,将初值设置为0xAA,方便对比

a_box.box_password=0x11111111;
a_box.temperature=0x2222;
a_box.humidity=0x3333;
a_box.lock_state=0x44;
a_box.use_state=0x55;
a_box.waybill_num=0x6666666666666666;
a_box.phone_num=0x7777777777777777;
a_box.obligate=0x88888888;
a_box.obligate1=0x9999;

以下是内存的内容:
这里写图片描述

蓝色部分是结构体占的内存,一共是40个字节,并不是按照上边计算的那样是32个字节,从图中可以看到,红色框里边还有0xAA,说明这一部分是没有被使用到的,因为是8字节对齐,所以这里计算或者使用指针取数据的时候要考虑到这一点

对齐之后的结构体

 struct BOX_STATE{
  u32 box_password; //4
  u32 obligate;  //4
  u16 temperature;//2
  u16 humidity;//2
  u16 obligate1; //2
  u8 lock_state;//1
  u8 use_state ;//1
  uint64_t waybill_num; //8
  uint64_t phone_num; // 8
};

//给结构体赋值,查看内存情况

memset(&a_box,0xAA,sizeof(a_box));//初始化这个结构体,将初值设置为0xAA,方便对比

a_box.box_password=0x11111111;
a_box.temperature=0x2222;
a_box.humidity=0x3333;
a_box.lock_state=0x44;
a_box.use_state=0x55;
a_box.waybill_num=0x6666666666666666;
a_box.phone_num=0x7777777777777777;
a_box.obligate=0x88888888;
a_box.obligate1=0x9999;

这里写图片描述

内存情况如上图所示,这次占用的是32个字节,里边没有0xAA,说明内存已经全部被使用了,这时候如果要是使用指针读取数据,根据结构体里边内容的大小进行偏移就可以取到数据了,对齐之后也节省了内存

项目中碰到的问题,记录一下,如有问题,请指出,虚心受教

内存对齐 结构体大小 内存空洞的分析 结构体是我们C语言中非常常见的一种复合数据类型,它的出现解决了那种比较复杂,抽象的事物描述,同时改善了这种函数参数较多容易出错的情况,当我们一下子需要好些变量时,我们完全可以用结构体去代替那些很多的变量。当然在C语言中,还有一些其他的复合类型,如union,enum... 这里我重点讲一下结构体的内存占用空间大小与内存空洞问题。     在我们的计算机中,字节是我们管理内存空间的最小单 阅读详情

相关推荐

C语言————结构体

接下来我们来了解C语言中很重要的内容:结构体。虽然到现在我们可以创建常量,变量,数组,但是存储的都是相同类型的数据,如果我们需要写入不同数据类型的信息怎么办,例如常见的身份证上的信息,有身份证号,有地址,有名字,有照片。又比如一个学生的学习,有学号,姓名,年龄,等等。这样的话,如果我们还是以前那样一个数据创建一个的话,岂不是很麻烦,当我们需要将不同数据类型存储在一起的时候这就引出了 结构体。这样大家大概知道结构体是什么样子了吧。

2302_80318761的博客 1256

【C语言】memset()函数详解(内存块初始化函数)

C语言库函数memset()函数简介及其具体使用详解.

C/C++领域,数据结构,linux,MySQl学习者 3万+

C语言的结构体对齐问题总结

C语言的结构体对齐问题总结

kermit的专栏 923

C标准库 memset 的一个问题

memset是C标准库的一个函数,其原型可以在string.h中找到。过多的介绍就不用了, 直接进入主题。一、为什么断定是memset出错?依然是数字图像处理的学习过程中遇到的一个问题。我在写BMP图像处理的时候, 考虑到BMP有灰度图像和彩色图像之分, 在BMP_get_Pixel_at函数中使用了memcpy和memset。代码如下:BOOL BMP_get_Pixel_at( const B...

LoveyChen的专栏 2606

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4026

【Python】多分类算法—Random Forest

【Python】多分类算法—Random Forest 本文将主要就Random Forest(随机森林)的多分类应用进行描述,当然也可运用于二分类中 文章目录【Python】多分类算法—Random Forest前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 本文主要引用的是sklearn 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import nump

weixin_43166884的博客 1万+

STM32使用结构体struct时的FLASH保存方式

STM32使用结构体struct时的FLASH保存方式 在实际应用中,定义如下结构体: typedef union { struct { temp[50]; }Array1; struct { u8 a; u8 b; u8 c; u16 d; u16 e; }Temp1; }NewType; 假设a = 0x01; a = 0x02; b = 0x03; c

woshiwogui的博客 2638

8.5/Q1,Charls最新高分文章解读!

8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。

gsky_sci的博客 1014

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

关于stm32中结构体的读写

昊月光华的博客 5220

双硬盘下Ubuntu 16.04与Win10双系统的安装

之前写过一个双系统安装过程,今天再次整理的原因是想重点强调双硬盘的区别。标红的一定要注意看,那就是我自己一步一步踏出来的坑啊...   基础步骤就不再重复,重点讲区别,需要看详细步骤的童鞋(或者你只有一个硬盘)请看我上一篇博客https://blog.youkuaiyun.com/weixin_40308540/article/details/80157444   区别:双硬盘和单硬盘的区别是什么呢?...

不吃包子 1122

智能解决装箱问题:使用优化算法实现高效包装

装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。

MindOpt_003的博客 5543

C语言下常用数据类型长度及结构体字节对齐问题

目前,Unix系统(64位)使用的都是LP64模型,Unix(32位)和Windows(32位)都使用的ILP32模型,64位Windows使用的是LLP64模型。指针类型存储的是地址变量,32位系统的地址位数为32bits,则指针长度为4字节,64位系统的地址位数为64bits,则指针长度为8字节。总体上看,LP64,ILP64,LLP64是64位平台上的数据模型,ILP32和LP32是32位平台上的数据模型。对于结构体中的成员变量,当不满足对齐规则时,需要在其前面填充一些字节保证当前成员是字节对齐的。

好好学习,天天向上 651

生成式引擎优化(GEO)全景指南:技术架构、实施策略与未来趋势

生成式引擎优化(GEO)全景指南摘要 GEO(生成式引擎优化)是针对AI生成内容(如ChatGPT、文心一言等)的优化策略,通过结构化数据、权威建设与语义优化提升企业内容在AI答案中的引用优先级,实现“无点击曝光”。其核心价值在于从流量竞争转向信任构建,突破传统SEO局限。技术架构依托RAG(检索增强生成)、向量数据库及反馈学习机制,动态优化内容生成与引用逻辑。实施策略包括:部署结构化数据(如JSON-LD)、维护动态知识图谱、适配多模态内容(3D/VR)、联合权威机构发布白皮书。行业案例显示,美妆、智能家

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1451

数据对齐问题

发信人: law (游戏*人生), 信区: C 标  题: Re: 发句牢骚 发信站: 饮水思源 (Fri May 24 15:59:56 2002) , 转信   不对齐的数据存取在x86上是影响速度, 到了sparc或者MIPS上就是个bus error。 对齐原则一般是对应指令操作数据的长度。 例如*(int *)p = 1; 在MIPS上一般会被编译成sw(store word)指令 p要

jackzhang的专栏 1267

代码的自由之旅:用AI写出无版权烦恼的Verilog

他们还基于这个数据集,训练了一个名叫“FreeV”的AI模型,不仅能写出好用的Verilog代码,还把版权侵权的风险降到了仅3%。为了让AI安全地写Verilog,研究团队提出了三个“法宝”:一个检测AI是否会生成侵权代码的测试方法、一个干净的Verilog数据集FreeSet,还有一个基于FreeSet训练的AI模型FreeV。AI的记忆力超强,能记住训练时见过的代码。测试发现,一些用Verilog数据训练过的AI,比如VeriGen,生成侵权代码的概率从9%涨到了15%,说明它们可能学了不该学的代码。

步子哥的博客 1808

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《深入理解 C 语言结构体:类型声明、内存对齐与位段实战指南》

摘要 本文深入探讨了C语言结构体的关键知识点,包括结构体声明、自引用、内存对齐规则等核心内容。首先复习了结构体的基本语法和初始化方式,重点分析了结构体特殊声明中的匿名结构体类型问题。随后详细讲解了结构体自引用的正确实现方法,并指出typedef使用时的常见错误。文章的核心部分通过具体示例解析了结构体内存对齐的四条规则,包括偏移量计算、对齐数确定和总大小补齐原则,并配合图示和VS验证展示了12字节对齐结果的形成过程。这些底层知识对理解复杂数据结构、优化程序性能至关重要,是C语言学习者的必备内功。

月夜的风吹雨的博客 1649

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言中的字节对齐问题

1.最近在工作中看了一些基于C和C++的程序,由于本人 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助...

law_csdn的博客 558

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言中的struct结构体对齐问题

C语言中的数据对齐问题 数据对齐:现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 以下面的代码为例: #include<stdio.h> typedef struct { char a; short b; int c; }test; int main(){ test t; t.a='

qq_44310495的博客 1970

C语言结构体深入解析【结构体嵌套结构体,结构体变量和指针,结构体和函数,计算结构体大小,结构体数组,结构体成员的访问,结构体与联合】

在C语言编程的世界里,结构体(`struct`)是一种复合数据类型,它允许你将不同类型的数据组合在一起,形成一个单一的复杂实体。这种特性极大地丰富了C语言处理现实世界问题的能力,特别是在设计复杂的数据结构和实现面向对象编程概念时。本文旨在深入探讨C语言中的结构体,包括其定义、使用场景、内存布局、对齐规则、以及高级应用技巧。

前端开发工程师 5075

C语言结构体字节对齐问题

C/C++结构体字节对齐问题1 前言2 举例3.其他 1 前言 对于结构体字节对齐问题,我发现我一直有一个误区,正是这个误区,给我带来了很大困扰,今天突然顿悟,在此记录一下,希望能帮到大家。 2 举例 #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)0)->f)) struct AD { int a; char b[13]; double c;}; #pragma pack(push) #prag

stone322的博客 767

C语言--结构体

本文介绍了C语言中结构体的基本概念和使用方法。结构体是一种自定义数据类型,可以将不同类型的数据组合成一个整体,用于描述复杂对象。文章详细讲解了结构体的声明、变量定义与初始化、成员访问(直接访问和间接访问)、自引用和重命名等基本操作。重点分析了结构体内存对齐规则,通过示例展示了成员排列顺序对内存占用的影响,并解释了内存对齐的原因(硬件平台限制和性能优化)。结构体通过合理组织数据成员,能有效管理复杂数据结构,提高程序的可读性和执行效率。

2301_81703165的博客 951

C语言结构中的边界对齐问题

没错,今天2月14,单身狗如我情人节也只能苦逼地撸代码了。不知道大家有没有发现一个奇怪的现象,见图~ 结构test里面包含了1个int型变量和2个char型变量,照理说sizeof( struct test )应该等于它们三个相加的结果6才对,为什么会等于8呢? 事实上,结构成员在内存中的存储并不是想当然地一个紧挨着一个排列下来的,由于提高数据读取速度的要求以及

ccyanxyz的博客 9609

C语言之结构体及位段

目录 结构体的声明 结构体与数组 结构体成员类型 结构体的声明 结构体自引用 结构体的定义和初始化 结构体成员的访问 结构体内存对齐 结构体的对齐规则 为什么要内存对齐 计算成员变量相对于结构体类型的偏移量 结构体传参 位段 举例: 位段的内存分配 关于位段类型我的理解(VS编译器) 位段的跨平台问题 结构体的声明 结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量 结构体与数组 数组:一组相同类型元素的集合 结构体:也是一些值得集..

m0_60027772的博客 2012

C语言结构体对齐

1、字节对齐概念 现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。 2、结构体对齐 在C语言中,结构体是种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组...

wu_chaowei的博客 314

c语言自定义类型——结构体,位段(匿名结构体,结构体的自引用,结构体的内存对齐)

这里写目录标题结构体的定义结构体类型的声明结构体的自引用结构体变量的定义和初始化结构体内存对齐(结构体的存放规则)结构体传参结构体实现位段位段的内存分配位段的跨平台问题位段的应用 结构体的定义 结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 数组是一组相同类型的元素的集合。结构体也是一些值的集合,结构体的每个成员可以是不同类型的。 为什么要使用结构体 现实生活中,我们会遇到很多复杂的对象,这些复杂的对象仅通过c语言中的整型数据类型或者浮点数数据类型是无法全面且准确的描述

weixin_47792933的博客 1630
上一篇: 关于STM32 使用ST-Link下载提示 Internal command error的问题
下一篇: STM32中使用long long 型的数据以及数据的转换
CallMeSumo
博客等级 码龄10年 82粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值