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

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));
时间: 2024-11-05 16:26:59

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

字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃

本文原链接: http://www.cnblogs.com/zouzf/p/4455167.html 先看一下这个链接:http://www.cnblogs.com/ren54/archive/2013/01/11/2856207.html 我遇到情况和这位朋友很类似:用二进制方式从文件读取内容到内存,假设内容只有7个字节,前面三个字节是三个字符,后四个字节的内容是一个int数据,在把后四个字节转成int数据时如(pFileContent是char*指针,已指向第四个字节):int intVal

结构体字节对齐问题(转)

原文出处:http://wenku.baidu.com/view/019e26b765ce0508763213e2.html 初学C,对结构体的使用sizeof计算所占字节数不是很明白,看了此篇文章,终于豁然开朗,转载过来,方便以后温故. #include<stdio.h> struct a {   char no[10];   int p;   long int pp;   unsigned int ppp;   char x;   float y;   double h; }xy; voi

C语言结构体的字节对齐原则

转载:http://blog.csdn.net/shenbin1430/article/details/4292463 为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址

C++字节对齐问题

关于C++字节对齐问题 关于C/C++的字节对齐 这两天写解析SWF文件的程序,在结构体指针和从文件里读出来的进行转换的时候遇到一些问题,就是有一个struct A,比如: struct A { char flag; int length; int id; .... }; 然后一个飘逸的 struct A *a = (struct A*)buffer;   // 世界一下清静咯 可惜在输出a中的成员的时候却发现老是不对,百思不得起解.今晚一想,可能是因为C++的字节对齐问题,所以直接就百度了一些

【转】C语言结构体的字节对齐原则

原文链接:http://blog.csdn.net/shenbin1430/article/details/4292463 为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定

ios下一个4字节对齐引起崩溃的问题

staticvoid TEACore(unsignedint in[2], unsignedint out[2], unsignedint key[4], long rounds) { unsigned int y = in[0], z = in[1]; unsigned int limit = 0, sum = 0; if(rounds > 0)// encrypt { limit = DELTA * rounds; while(sum != limit) { y += ((z<<4)

【C++】字节对齐,也就是一个结构体的实际大小

字节对齐是面试笔试经常考到的一个知识点 计算一个结构体大小只需要进行如下几个步骤即可. 1.确认结构体中所有成员的长度大小 可以引用此表. char short int long float double long long long double Win-32 长度 1 2 4 4 4 8 8 8 模数 1 2 4 4 4 8 8 8 Linux-32 长度 1 2 4 4 4 8 8 12 模数 1 2 4 4 4 4 4 4 Linux-64 长度 1 2 4 8 4 8 8 16 2.确

stm32中字节对齐问题

ARM下的对齐处理   from DUI0067D_ADS1_2_CompLib 3.13 type  qulifiers 有部分摘自ARM编译器文档对齐部分  对齐的使用:  1.__align(num)     这个用于修改最高级别对象的字节边界.在汇编中使用LDRD或者STRD时     就要用到此命令__align(8)进行修饰限制,来保证数据对象是相应对齐.     这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节     对齐,但是不能让4字节的对象2字节对齐.  

字节对齐

今天我们总结在C++和C语言中让我们头疼的字节对齐问题: 一.首先来看什么是字节对其? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任 何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 二: 那么问题就来了为什么要字节对其?以及字节对其的作用? 各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存