C/C++中使用char类型进行Type punning是否安全?
关于char类型类型双关的未定义行为问题
首先直接给出结论:针对char(或unsigned char、std::byte)类型的类型双关,在符合C++标准规则的前提下,确实不会产生未定义行为,但要明确其适用范围和前提。
核心规则说明
C++标准明确规定:任何对象的存储都可以被视为由char、unsigned char或std::byte类型的字节序列构成。通过这几种类型的指针,直接读取或写入对象的底层字节是合法操作,这是类型双关规则中的特殊例外,专门用于允许程序访问对象的原始内存表示。
针对你代码的分析
你的代码片段:
int *a = new int[3]; for(b = 0;b <= 2;b++){ a[b] = b; } char *ptr = (char*)&a;
这里&a是指向int*类型变量的指针(即int**),将其转换为char*后,ptr指向的是变量a本身的内存字节。后续通过ptr去读取或修改这些字节都是合法的,不会触发未定义行为。
需要注意的误区
- 这个例外仅适用于用char/unsigned char/std::byte指针访问其他对象的字节,反过来把char指针强制转换为非char类型指针去访问内存,依然需要满足严格别名规则,否则会产生未定义行为。
- 如果通过char指针修改对象的字节,需要确保修改后的字节序列对于原对象类型来说是合法的表示(比如修改int的字节后,结果不能是该平台int类型的陷阱表示,否则后续访问原int对象会触发未定义行为)。
内容的提问来源于stack exchange,提问作者Ichimonji_bleach
相关产品推荐
相关产品推荐

