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

解引用强制转换后的指针是否违反严格别名规则?附代码咨询

严格别名规则相关问题解答

问题1:解引用经过强制转换的指针是否违反严格别名规则?

不是所有强制转换后解引用的操作都违反严格别名规则。严格别名规则的核心限制是:不能用与对象实际类型不兼容的指针类型来访问该对象,但存在多个合法例外:

  • void* 可以安全转换为任意对象指针类型,再解引用访问原对象完全合法
  • 字符类型(char/unsigned char/signed char)的指针可以访问任何类型的对象
  • 联合的不同成员指针之间可以互相访问(对应你提到的实际代码场景)
    只要强制转换后的指针类型与原对象的实际类型匹配,或者属于上述例外情况,就不会违反严格别名规则。

问题2:以下代码是否违反严格别名规则(或其他规范规则)?

先看给出的代码:

void *get_int_ptr(void)
{
    static int ival = 0;
    return (void*)&ival;
}

#define GET_INT() *((int*)get_int_ptr())

void main()
{
    GET_INT() = 123;
    printf("%i", GET_INT());
}

严格别名规则判断:

这段代码不违反严格别名规则。原因是:get_int_ptr返回的void*指向的是实际类型为int的对象ival,宏里将void*强制转换为int*后解引用,此时指针类型与原对象的实际类型完全一致,符合规则要求。

其他规范问题:

代码中的void main()不符合C标准规范,C标准规定main函数的返回类型必须是int,正确写法应为:

int main()
{
    GET_INT() = 123;
    printf("%i", GET_INT());
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:30:52