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

下述代码是否违反严格别名规则?两种争议观点解析

这段代码是否违反C语言严格别名规则?

先看咱们要讨论的代码:

int a = 0;
*((int *)((char *)&a)) = 1;

针对这段代码是否违反严格别名规则,目前有两种截然不同的观点:

  • 观点一:不违反严格别名规则
    理由是:变量a本身就是int类型,最终的操作是通过int*指针解引用这个int变量——这完全符合C标准的要求。中间的char*只是一个过渡转换,并没有改变最终访问对象的类型匹配性,核心逻辑是合法的。而且C标准明确允许用char*类型指针访问任何类型的对象,这里的转换只是绕了个圈子,本质还是用对应类型的指针操作对应类型的变量。

  • 观点二:违反严格别名规则
    持这个观点的开发者认为:代码中先将int*强制转换为char*,随后又把char*转回int*并解引用,这个过程违反了严格别名规则。他们觉得严格别名规则禁止通过不兼容类型的指针访问对象,虽然char*可以访问任意类型,但反向转换后用原类型指针访问的操作,可能被编译器判定为违规。

补充说明(专业视角)

实际上,观点一是正确的。C标准里的严格别名规则明确指出,char类型的指针是特例——允许用来访问任何类型的对象。而当你把char*转回原对象的类型指针(这里就是int*),再去解引用访问原对象时,本质上还是在使用与对象类型匹配的指针进行操作,并没有违反规则。编译器也会认可这种操作的合法性,不会触发未定义行为。

内容的提问来源于stack exchange,提问作者izac89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:52:24