显式指针转换的教训


下面的代码会有错么?

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)

相关文章:

posted on 2009-02-11 18:27  xlander  阅读(189)  评论(0编辑  收藏  举报

导航