最近遇到一个很怪异的问题:程序在模拟上跑着没事,在使用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的倍数的地址上。
分享到:
相关推荐
结构体字节对齐规则,主要是介绍结构体字节对齐规则,内容有点长,但是很全面.
关于C语言中的结构体字节对齐问题,在《C与指针》一书中提到,但是似乎没有说清楚,还是我理解不完全?所以,根据书上和网上资料,总结一些关于C语言中的结构体字节对齐的知识。这里的讨论和代码,都在VS2010下,GCC...
这段时间移植公司的linux+i386程序到Arm+linux平台,本以为是件工作量很小的事情,以为只要改几个驱动程序就OK了,没想到在应用程序这一块卡了很长时间。其中最烦的事情就莫过于结构体内存边界对齐了。搞了这么久,...
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.
先看一个结构体: struct S1 { char c; int i; }; sizeof(s1)在VC6中按默认设置得到的结果为8。 我们先看看sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那让我们...
结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中...
结构体数据成员指针对齐,通过指针偏移给数据成员赋值。
关于结构体的内存对齐关于结构体的内存对齐关于结构体的内存对齐
C语言结构体的字节对齐及指定对齐方式.docx
关于gcc编译结构体的对齐说明
对于字节占用与对齐,excel表格中做了稍微修改,与12-27号版本比较,代码没有改动。
这个压缩文件是用来查看一个结构体内存布局,是我在查看字节对齐的时候写出来的,内容很简单,但是分析结构体内存布局上还是对你有一定帮助
写在前面的话最近有被问到:结构体怎么写占用内存小?很惭愧,当时没答到点子上 ~~呜呜呜结构体占用内存计算结构体中同样的变量个数,却可能导致占用内存的大小不同。直
C语言结构体内存对齐问题.pdf
C语言结构体内存对齐问题浅析
C语言结构体的字节对齐原则[定义].pdf
要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下
从结构体内变量所占空间大小,默认内存对齐大小,强制内存对齐方法,变量在内存中布局的详细分析,语言言简意赅,绝无废话,为读者解决了大量寻找书籍的烦恼,读者可以花费几分钟的时间解决掉结构体内存对齐的所有问题,...
A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include #include #define PRINT_D(intValue) printf(#intValue is %d\n, (intValue)); #define OFFSET(struct,member) ((char *)&((struct ...
结构体内存对齐原则,讲的非常详细,希望能给大家些帮助。