如何从C中的给定char指针读取4个字节的数据

Mrm*_*rmj 1 c arrays byte pointers cortex-m


场景是,我想读取来自给定指针的4字节数据,该指针是char类型.
例如:考虑以下情况 -

int a=0;
char* c; // This will have some address 
Run Code Online (Sandbox Code Playgroud)

我想做的是从c(即地址)开始读取4个字节并将它们分配variable a为整数.

我的解决方案

a = *(int*)c;  // Assembly is LDR    r1, [r6,#0x00]
Run Code Online (Sandbox Code Playgroud)

我的问题:
以上解决方案在某些架构上运行良好但在某些架构上失败.具体来说,在我的情况下,它在Arm CortexM0上失败了.

如果任何人有任何便携式,高效率(最少装配)替换我的解决方案,请分享,这将是一个很大的帮助,我提前感谢你;)

请询问是否需要更多信息.

Som*_*ude 6

问题可能是因为对齐.某些CPU架构无法在未对齐的地址上读取或写入非字节值.

解决方案是改为使用未对齐的字节访问,这可以通过以下方式轻松完成memcpy:

memcpy(&a, c, sizeof a);
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案可能仍存在字节序问题. (2认同)
  • @Mrmj大多数编译器都对`memcpy`进行了特殊处理,使它们非常高效,甚至可以用一些指令内联它们.你说你只用一条指令就可以编码吗?但如果问题是对齐,那么你实际上*不能*只用一条指令来做.您还应该考虑代码的可维护性和易读性,特别是如果字节顺序不是问题.最后,你为什么不试试呢?构建优化并查看生成的汇编代码? (2认同)