char buf[128] = {0};int a;a = *(int *)&buf[2];这种方式存在如下两个问题和风险。特别是内存对齐的问题,但是在windows x86平台下会对内存进行强制对齐从而实现代码预期,所以上述代码在x86平台下可以稳定运行而不出问题(除了效率降低之外)。
潜在的内存对齐问题
buf[2] 的地址可能不是 int 类型所需的对齐边界(通常4字节对齐)
在某些架构上,非对齐访问会导致总线错误或性能下降
未定义行为
从 char 数组的不同位置读取 int,违反了严格别名规则
如果 buf[2] 之后剩余字节不足 sizeof(int),会越界访问
但是在嵌入式平台调试中,相同的代码导致了严重的死机问题,经过多番排查发现在嵌入式处理器(如 ARM Cortex-M0/M3/M4, 单片机)上强制要求访问多字节数据(如int)时地址必须对齐,否则会触发 HardFault 或 UsageFault,导致程序直接死机。只有少数 x86 嵌入式(如老款 AMD Geode)允许非对齐访问,但会付出性能代价。
因此,在嵌入式下更安全、最可移植的方式是使用memcpy:
char buf[128] = {0};int a;memcpy(&a, &buf[2], sizeof(int));memcpy方式相对于之前强制类型转换的优势在于:
无对齐问题:编译器会生成处理非对齐拷贝的代码(可能是逐字节或专用指令)。
无别名问题:完全符合 C 标准。
编译器优化:现代嵌入式编译器(ARMCC、GCC)会将小的固定长度 memcpy 优化为内联的加载/存储指令,性能与强制转换相同,但更安全。
夜雨聆风