ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

2020.5.8工作问题记录————C++结构体内数据错位

2021-05-09 11:32:09  阅读:120  来源: 互联网

标签:错位 定义 int 2020.5 C++ char 数据 结构


工作问题记录————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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有