我的代码遇到了一些困境。
我有一个函数将指针(uint8_t*)返回到数据缓冲区。当我需要数组中的 2 个值作为 uint16_t 时,将此指针强制转换为 uint16_t 是否可能且合法?还是对齐会有问题?缓冲区通过从 I2C 读取字节来填充。
MCU 上存在问题,但当我使用 Visualstudio 尝试此操作时,一切正常。 MCU - 硬故障
uint8_t arr[8];
uint8_t * FuncReturnPointer(void)
{
arr[0] = 0xEE;
arr[1] = 0xFF;
return arr;
}
main
{
uint16_t val16 = 0;
val16 = *(uint16_t*)FuncReturnPointer();
}
有什么问题/危险吗?
最佳答案
这里有两个不同的问题:
- 严格的别名违规
- 可能存在对齐违规
其中任何一个都可能导致各种“有趣”的现象。我敢打赌,这是由于对齐违规造成的,即 arr
并不恰好位于可被 _Alignof(uint16_t)
整除的地址处。正确的解决方法是使用
算术:
val16 = ((uint16_t)*address << 8) | (address);
memcpy
:memcpy(&val16, address, sizeof (val16));
关于c - 返回指向数组的指针的函数 - 转换并获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58660039/