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

问题描述:在开发过程中,构建了一个结构体,然后将结构体保存到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,说明内存已经全部被使用了,这时候如果要是使用指针读取数据,根据结构体里边内容的大小进行偏移就可以取到数据了,对齐之后也节省了内存

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值