2020.5.8工作问题记录————C++结构体内数据错位
作者:互联网
工作问题记录————C++结构体内数据错位
最近工作中遇到一个问题,在做甲方的代理服务时,要传送一组数据,用结构体格式,在处理数据时,结构体数据正确,但是传出数据处理函数时,数据出现了错误。
首先,结构体的内容很多,类似如下:
struct My_msg
{
int socketid;
char cmd[5];
char termid[21];
char appid[11];
char site1[51];
char site2[51];
char reqtime[20];
int reqt;
char rsptime[20];
int rspt;
char seqno[33];
char respflag[5];
char tips[201];
char origcode[11];
char origtips[201];
long sessionid_high;
long sessionid_low;
unsigned int keyid;
unsigned int keylen;
char checkinfo[33];
int checksum;
unsigned char key[2049];
};
现在问题描述就是,在子函数 func()中处理结构体内数据,处理完在子函数中打印数据,结果正确,但在传出子函数后,结构体数据错误。
一开始我并没有去注意结构体的定义(甲方直接交付给我们的demo中定义好了),想的是我是用指针传入的结构体,因为时间较紧,虽然感觉指针应该和引用结果是一样的,还是改成了引用试一试,还是数据错误。
那就说明,问题没有出在C++最痛苦的指针部分,没办法,只好将整个结构体内数据全部输出,进行比对。
比对下来发现结构体内原本正确的数据在传出子函数后,中间 reqtime[20] 到 reqt 部分开始,数据错位,左移了2个字节。再一看,reqtime 是 char 型数组,reqt 是 int 型数据,又是在结构体里,那么数据错位很有可能就是C++内存里的数据自动对齐的问题了。
再去看结构体的定义文件,发现确实就是这个原因,甲方的定义中既没有将结构体内通类型的数据放在一起,也没有进行 pragma pack 的手动设置对齐,难怪会出现数据错位。
接下来,我对结构体定义进行了手动对齐,问题解决。
#pragma pack(4)
struct My_msg{
...
}
#pragma pack()
由此,得到经验,在定义复杂结构体时,一是最好将同类型的数据放在一起,尽量不要一个 int 一个char 之类的穿插定义,二是使用结构体时一定要手动设置对齐格式,否则既容易浪费内存空间,又容易出现数据错位的错误,而且出错后很难定位。
标签:错位,定义,int,2020.5,C++,char,数据,结构 来源: https://blog.csdn.net/weixin_43948991/article/details/116562242