码迷,mamicode.com
首页 > 其他好文 > 详细

由字节对齐产生的一个应用崩溃的问题

时间:2016-12-23 13:58:02      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:pre   查找   内存   使用   字节   target   数据   地址   资料   

1.起因:cocos2dx打包到手机后,接收数据消息进行处理时崩溃

一个由char+short+short+short+long long组成的数据通过网络传给客户端的时候,进行反向数据类型解析还原的时候在long long的位置崩溃掉了。

如下面的代码:

long long out_val = *((long long*)(_recv_data_buf + 3*sizeof(short) + sizeof(char)));

 

2.从上面的代码来看是完全没有问题的,该用#program pack(1)的都用了,同时也通过sizeof一个数据结构来验证的确是1字节对齐的。

后面在查找相关资料的时候,发现了如下的帖子:《C语言 字节型指针转换成整型指针 引发4字节对齐问题》

关键信息截图如下:

技术分享

 

3.通过上面的信息,打印一下对应的long long数据对应的内存地址位置,发现是一个单数,肯定是非8字节的边界上。(上面提到int在4字节边界,猜测long long在8字节边界,暂时没有找到相应资料佐证这个猜测)

 

4.解决办法:不使用直接数据转换,使用memcpy,修改后不再崩溃且数据正确,如下:

long long out_val;
memcpy(&out_val, _recv_data_buf + 3*sizeof(short)+sizeof(char), sizeof(long long));

 

由字节对齐产生的一个应用崩溃的问题

标签:pre   查找   内存   使用   字节   target   数据   地址   资料   

原文地址:http://www.cnblogs.com/chevin/p/6214379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!