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,说明内存已经全部被使用了,这时候如果要是使用指针读取数据,根据结构体里边内容的大小进行偏移就可以取到数据了,对齐之后也节省了内存
项目中碰到的问题,记录一下,如有问题,请指出,虚心受教
相关文章推荐
- C语言结构体内存对齐问题
- C语言结构体变量字节对齐问题总结
- 初识联合体、结构体中的数据对齐问题
- C语言中结构体对齐问题
- C语言结构体对齐问题
- C语言学习笔记(结构体对齐问题)
- VC中结构体内存分配问题透析(“字节对齐”访问数据)
- C语言结构体对齐问题详解
- C语言结构体内存对齐的问题
- C结构体中数据的内存对齐问题
- C结构体中数据的内存对齐问题【转自hbyh专栏】
- C语言结构体对齐问题详解
- c语言结构体字节对齐问题
- C 语言编译过程 C语言中各种数据存储的不同内存区域 关于sizeof 结构体比实际的大的问题
- 结构体 对齐的问题
- 学点 C 语言(17): 数据类型 - 因类型引发的问题或错误
- 一个C程序的数据类型对齐问题
- C结构体中数据的内存对齐问题
- C/C++中的结构体对齐问题(内存对齐)
- 结构体字节对齐问题