我正在try 创建一个函数,将uint16_t转换为uint8_t[2]在C中.

下面的代码已经过测试,但即使在阅读了反汇编之后,我也不确定它是否可移植或安全.

static inline uint8_t* write_u16(uint16_t in, uint8_t out[2], ArchEndian_t endian) {
    if (NATIVE_ENDIAN != endian){
        in = byte_swap(in);
    } 

    *((uint16_t*)out) = in; //< Is this portable and safe?

    return out; 
} 

我应该如何考虑用C语言进行类型转换?

推荐答案

为此使用强制转换违反了严格的锯齿要求.

你应该用memcpy这样做:

#include <string.h>
#include <stdint.h>

static inline uint8_t *write_u16(uint16_t in, uint8_t out[2], ArchEndian_t endian) {
    if (NATIVE_ENDIAN != endian) {
        in = byte_swap(in);
    } 
    return memcpy(out, &in, sizeof(in));
} 

C++相关问答推荐

C中空终止符后面的数字?

如何将已分配的数组(运行时已知的大小)放入 struct 中?

自定义应用程序上的日志(log)轮换问题

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

在C语言中,是否可以使枚举数向后计数?

加密解密工作正常,但返回错误0x80090005

使用sscanf获取零个或多个长度的字符串

在基本OpenGL纹理四边形中的一个三角形中进行渲染

在创建动态泛型数组时,通过realloc对故障进行分段

如何在C中使数组变量的值为常量?

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

Linux分段故障(核心转储)

具有正确标头的C struct 定义问题

如何修复我的qsort()算法?它每次都给出不同的结果

Matlab/Octave对conv2函数使用哪种方法?

将不同类型的指针传递给函数(C)

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

可以从指针数组中的值初始化指针吗?

为什么这里的符号没有解析?