现在的位置: 首页 > 综合 > 正文

ARM平台 结构体字节对齐引起的一个问题

2013年10月11日 ⁄ 综合 ⁄ 共 1116字 ⁄ 字号 评论关闭

      最近遇到一个很怪异的问题:程序在模拟上跑着没事,在使用MTK平台的手机上跑着没事,在部分使用展讯平台的手机上也运行正常,但在个别使用展讯平台的手机上就是出现问题。 

 

程序实现的功能是:创建一个本地输入框,并显示一行文本。这个创建文本框的操作是手机平台提供的,要显示的文本是应用提供的。应用把指向“要显示的文本”的地址传给手机平台提供的创建文本框的函数。在部分展讯手机平台上文本内容显示不出来。

 

     解决过程:

     1.  原来的问题是:

        typedef struct

       {

char ch;

                char Text[20];

       }TextS;

 

       TextS *pTextS = malloc(sizeof(TextS));

       strcpy(pTextS->Text, "abc" );   /*这里用ASCII编码,手机平台需要使用UNICODE编码*/

        现在把pTextS->Text传递给创建手机平台提供的创建本地输入框的函数,此时“abc”显示不出来,从显示效果来看,是三个空格和一个光标。

      2. 现在寻找一个替代的方案:

             定义变量char Text[20] = "abc"; 现在把把Text传递给创建手机平台提供的创建本地输入框的函数,此时“abc”能够显示出来。 

            此时说明应该是结构体字节对齐的问题。

      3. 修改TextS结构体定义,验证是否是“结构体字节对齐”引入的问题。

          typedef struct  {char ch;  char Text[20]; }TextS;  把结构体TextS定义改为typedef struct  {char ch[2];  char Text[20]; }TextS; 或typedef struct  {char ch[4];  char Text[20]; }TextS; ,此时“abc”能够显示出来。改为typedef struct  {char ch[3];  char Text[20]; }TextS; 此时“abc”不能够显示出来。

 

  说明确实是结构体对齐引入的问题。

 

       4. 原理分析:从网上了解到,大部分平台可以读取从任何地址开始的变量,而有的平台要求所要读取的变量必须是2的倍数。如果一个变量的地址是0x1001,这时平台会从0x1000读取这个变量的值,这样就会出现乱码的问题。“abc”在有的情况下不能显示就是因为“abc的其实地址为奇数,这样处理器在读取时,会从偶数地址读取,导致乱码”。对于定义的变量char Text[20],可以显示“abc”,是因为编译把单独定义的变量放在4的倍数的地址上。

 

 

 

 

 

 

抱歉!评论已关闭.