由字节对齐产生的一个应用崩溃的问题
2016-12-23 12:31
337 查看
1.起因:cocos2dx打包到手机后,接收数据消息进行处理时崩溃(同一套代码在windows和centos下都能正常运行)
一个由char+short+short+short+long long组成的数据通过网络传给客户端的时候,进行反向数据类型解析还原的时候在long long的位置崩溃掉了。
如下面的代码:
2.从上面的代码来看是完全没有问题的,该用#program pack(1)的都用了,同时也通过sizeof一个数据结构来验证的确是1字节对齐的。
后面在查找相关资料的时候,发现了如下的帖子:《C语言 字节型指针转换成整型指针 引发4字节对齐问题》
关键信息截图如下:
3.通过上面的信息,打印一下对应的long long数据对应的内存地址位置,发现是一个单数,肯定是非8字节的边界上。(上面提到int在4字节边界,猜测long long在8字节边界,暂时没有找到相应资料佐证这个猜测)
4.解决办法:不使用直接数据转换,使用memcpy,修改后不再崩溃且数据正确,如下:
一个由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));
相关文章推荐
- 结构体、联合体的应用,以及字节对齐和字节序的问题
- ios下一个4字节对齐引起崩溃的问题
- 字节对齐问题产生的Crash
- C语言中结构体存储的一个字节对齐问题
- eclipse创建一个Android应用工程产生的问题汇总
- C语言中一个字节对齐问题的分析
- vs05字节对齐问题又一不小心就弄去了我一个下午的时间
- windows和Linux之间socket传输结构体关于字节对齐产生的问题
- ios平台上一个由字节对齐问题导致的crash
- ARM平台 结构体字节对齐引起的一个问题
- 字节对齐问题----一个很古老的基础问题
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- C#通过SOCKET与delphi 的通讯问题(一)之 字节对齐
- 一个用js限制用户输入字节个数的问题.
- VC++中关于字节对齐的问题
- arm的字节对齐问题
- 关于字节对齐的问题(vs.net)(转载)
- Asp.net中处理一个站点不同Web应用共享Session的问题
- 四字节对齐问题
- 一个索引问题导致大量LOG产生,填满磁盘——ORA-08102