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的倍数的地址上。
程序实现的功能是:创建一个本地输入框,并显示一行文本。这个创建文本框的操作是手机平台提供的,要显示的文本是应用提供的。应用把指向“要显示的文本”的地址传给手机平台提供的创建文本框的函数。在部分展讯手机平台上文本内容显示不出来。
解决过程:
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的倍数的地址上。
相关文章推荐
- ARM程序由于字节对齐引起的问题深入分析[转]
- ARM程序由于字节对齐引起的问题深入分析
- ARM平台的字节对齐问题
- ARM平台的字节对齐问题
- ARM程序由于字节对齐引起的问题深入分析
- ios平台上一个由字节对齐问题导致的crash
- C语言中结构体存储的一个字节对齐问题
- ARM程序由于字节对齐引起的问题深入分析
- 结构体、类在内存中的字节对齐问题
- [zz]结构体字节对齐问题
- 结构体中字节对齐的问题
- 字节对齐问题----一个很古老的基础问题
- C - 结构体字节对齐问题
- 结构体字节对齐问题
- 关于字节对齐、结构体偏移地址、字位段问题的例子程序说明
- C语言结构体变量字节对齐问题总结
- 结构体字节对齐问题
- c语言结构体字节对齐问题
- ios下一个4字节对齐引起崩溃的问题
- 结构体的字节对齐问题