显式指针转换的教训
发布:xlander | 发布时间: Wednesday, February 11, 2009下面的代码会有错么?
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平台下,很少有人意识到这种问题,至少没有提及到这种问题。程序编译中的字节对齐这篇文章对这个问题描述得非常详细。
发布:xlander | 分类:软件开发 | 评论:1 | 引用:0 | 浏览:
| TrackBack引用地址
- 相关文章:
- 1.边界对齐问题
- 打印AC的值,在这里,他可能地两bits不为0,int为32位,需4字节对齐,有编译选项__align可设定
PC中,是由8位机->16位机->32位机->64..,向上兼容的 - 6/17/2009 8:20:58 PM 回复该留言
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。





