显式指针转换的教训
下面的代码会有错么?
unsigned short int a;
unsigned short int *pc = 0;
unsigned char ac[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
int main(void)
{
while(1)
{
pc = (unsigned short int *)ac;
a = *pc;
pc = (unsigned short int *)(ac+1);
a = *pc;
}
}
没错。我一直这么用的,用VC开发了这么多年,这么简单的事儿我还是知道的。
这种想当然,很遗憾的,我不得不承认,我错了。
确切地说,这种代码在x86平台下,没有任何问题,但是,当我在ARM下也这么做的时候就有问题了。
这是上面代码的执行结果,尽管可以通过调试器看到*pc=0x0302,但是,变量a却赫然的显示为0x0102。
搜索一下网络上的资料,询问类似问题的人不在少数,大都是ARM之类的RISC指令集,而在x86平台下,很少有人意识到这种问题,至少没有提及到这种问题。程序编译中的字节对齐这篇文章对这个问题描述得非常详细。
Copyright © 2008
分类: 软件开发 | Tags: C 跨平台 ARM 指针 | 添加评论(1)
相关文章:
Google Code上两个LPC21XX开源项目 (2009-7-4 14:30:32)
基于ARM的网络收音机 (2009-3-24 19:9:11)
使用结构体中成员变量指针的教训 (2008-9-19 18:30:42)
结构体中位段、字节对齐并用的教训 (2008-8-31 18:32:53)
C语言的跨编译器编译 (2008-8-26 18:38:15)