由字节对齐产生的一个应用崩溃的问题
1.起因:cocos2dx打包到手机后,接收数据消息进行处理时崩溃(同一套代码在windows和centos下都能正常运行)
一个由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));
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~