首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IAR编译器中的指针

IAR编译器中的指针
EN

Stack Overflow用户
提问于 2016-05-25 20:16:39
回答 2查看 293关注 0票数 3

长话短说,我在C中使用了IAR编译器。

代码语言:javascript
复制
uint8_t packet[2048];
uint32_t* src = (uint32_t*)&packet[9];
uint32_t var = *src++;

最后一条线会导致公共汽车故障。

代码语言:javascript
复制
uint8_t packet[2048];
uint32_t* src = (uint32_t*)&packet[9];
uint32_t var = 0xFE;
*src++;

现在没有公共汽车故障。我可以在调试器中看到src指向我希望它指向的数据。增量--它按预期工作,但试图读取它会导致总线故障。

有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-25 20:30:40

这可能是,您的MCU需要读取32位整数,以对齐32位。

&packet[9]绝对不是32位对齐的,这就是为什么你会出错。

票数 5
EN

Stack Overflow用户

发布于 2016-05-25 22:11:19

对于&packet[9]uint32_t可能没有正确对齐。在ARM CPU上看到“总线错误”通常是对齐错误的标志。看这里用于解释对齐。

在第二个示例中,它可能通过优化*操作来避免总线故障,因为您从不使用结果。

请注意,即使您修复了这个问题,代码仍然会违反严格的混叠规则而导致未定义的行为。(uint8_t不能别名为uint32_t)。有些编译器目前看来“工作正常”,但代码在将来的任何时候都可能中断。

您的代码的安全等价物是:

代码语言:javascript
复制
uint8_t *src = &packet[9];
uint32_t var;
memcpy(&var, src, sizeof var);
src += sizeof var;

注意,如果源数据被指定为具有整数的特定字节顺序(例如,您是从网络流中获取它,而不是前面通过同一方法保存的数据),那么您将希望使用一个方法来读取独立于uint32_t表示的数据。(换句话说,"endianness")。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37446831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档