编程语言
首页 > 编程语言> > 2020.5.8工作问题记录————C++结构体内数据错位

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