项目开发过程当中常常会遇到,同一个结构体在两个工程中使用,好比api和后台服务。为了通讯一致,两处固然要有彻底一致的结构体定义。
可是有时候,明明看到两处结构体定义同样,可是api传过来的结构体,后台服务解析(通常是强转)出乱码。后面通过仔细排查,才看到后台服务定义该结构体的头文件中有以下代码:api
#pragma pack (push,1) //设置1字节对齐 //结构体定义在此处。。。。 #pragma pack(pop) //取消1字节对齐
而在api的工程中,没有像上面这样来定义该结构体。两处定义出现了不一致,致使解析出错。
而上面代码是什么意思呢?
在缺省状况下,C编译器为每个变量或是数据单元按其天然对界条件分配空间。通常地,能够经过下面的方法来改变缺省的对界条件:spa
好比两种结构体定义方式:code
struct sample1 { char a; int b; }; #pragma pack(push,1) struct sample2 { char a; int b; }; #pragma pack(pop)
单从字面上看,sizeof(sample1)==sizeof(sample2)。
实际上,结构体sample1按照天然对界对齐(按照int的长度,4字节对齐),sizeof(sample1)=4+4=8;
结构体sample2按照设定的对齐方式对齐(1字节对齐),sizeof(sample2)=1+4=5。
固然你把sample1强转成sample2,会产生字节错位,形成乱码。这是一个经验教训,切记!!开发