You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:54:53