您的位置:首页 > 编程语言 > C语言/C++

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

2017-04-21 10:24 267 查看

问题描述:在开发过程中,构建了一个结构体,然后将结构体保存到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字节对齐,所以这里计算或者使用指针取数据的时候要考虑到
4000
这一点

对齐之后的结构体

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,说明内存已经全部被使用了,这时候如果要是使用指针读取数据,根据结构体里边内容的大小进行偏移就可以取到数据了,对齐之后也节省了内存

项目中碰到的问题,记录一下,如有问题,请指出,虚心受教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: