`
hunxiejun
  • 浏览: 1137754 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

最近遇到一个很怪异的问题:程序在模拟上跑着没事,在使用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的倍数的地址上。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics