您的位置:首页 > 其它

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

2010-06-10 13:47 204 查看
最近遇到一个很怪异的问题:程序在模拟上跑着没事,在使用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的倍数的地址上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: