关于使用memcpy进行类型强制转换及char*例外规则的技术问询
用memcpy实现类型转换的方法
要通过memcpy完成不同类型的值的二进制表示转换,核心是把一个变量的二进制字节内容直接复制到另一个类型的变量中,绕开指针强制转换的未定义行为。
比如要把一个int值转换成对应的float二进制表示,代码示例如下:
#include <string.h> int main() { int int_val = 0x41480000; // 对应float类型的18.0的二进制表示 float float_val; // 将int_val的字节内容完整复制到float_val的内存空间中 memcpy(&float_val, &int_val, sizeof(float_val)); // 此时float_val的值即为18.0 return 0; }
原理很简单:memcpy仅负责逐字节复制内存内容,不会对数据的类型做任何假设或转换,因此完全符合C语言的类型规则,不会触发未定义行为。
char*的别名规则例外
C语言的类型别名规则(也就是支持TBAA优化的基础规则)禁止用不同类型的指针访问同一块内存,但char*(包括signed char*和unsigned char*)是明确的例外:
- 允许用
char*类型的指针访问任何类型对象的内存,读取或修改其字节内容,这属于合法行为,不会触发未定义行为。 - 反过来,用其他类型的指针访问
char数组的内存也是合规的。
举个用char*读取int变量字节内容的示例:
#include <stdio.h> int main() { int val = 0x12345678; unsigned char* ptr = (unsigned char*)&val; // 逐字节打印int变量的内容,该操作合法 for (int i = 0; i < sizeof(int); i++) { printf("%02x ", ptr[i]); } // 输出结果取决于系统字节序,小端系统会输出 78 56 34 12 return 0; }
这个例外是为了支持字节级别的内存操作场景,比如序列化、内存拷贝、字节序转换等。
内容的提问来源于stack exchange,提问作者yuangsc
相关产品推荐
相关产品推荐

