惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
Vercel News
Vercel News
Martin Fowler
Martin Fowler
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LangChain Blog
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs

博客园 - xlander

跟实际生活相关的饭否应用 5个跟实际生活相关的Twitter应用 Google Code上两个LPC21XX开源项目 Router牌音箱 基于ARM的网络收音机 博客程序换成了Z-Blog的 音箱?储钱罐? 使用结构体中成员变量指针的教训 结构体中位段、字节对齐并用的教训 C语言的跨编译器编译 日本某商场里的智能瀑布 ADS下C语言中局部变量的存储位置分配 救活TrackBack的偏方 近期几个开源的嵌入式产品 几个自制心电图的网络资源 哇哦级的贴片焊接教学视频 自动五线谱识别及音乐合成装置 简易指纹识别授权访问系统 PIC18F2550实现的基于HID的USB示波器
显式指针转换的教训
xlander · 2009-02-11 · via 博客园 - xlander

下面的代码会有错么?

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)

相关文章: