c - 返回指向数组的指针的函数 - 转换并获取值

标签 c function pointers return

我的代码遇到了一些困境。

我有一个函数将指针(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/

相关文章:

objective-c - 如何在 Objective-C 中返回 C 风格的整数数组?

c - 在 C 中调用和执行函数的最快方法是什么?

r - 在 R data.table 中,添加一个名称基于字符串的列

C、表达式必须是可修改的左值(改变结构成员的值)

c - memrchr 给出一些垃圾值

C Shell : Redirection and piping working, 但不是输入和输出重定向与 1 个或多个管道的组合

c - 为什么 Ideone.com C 编译器不捕获不匹配的指针类型?

windows - 如何使用PowerShell为多个子目录创建目录连接?

c++ - 在插入期间对链表进行排序

C 字符数组指针不是有效语句