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

通过char*访问指针的对象表示是否属于未定义行为?

这段代码是否属于未定义行为?

先明确代码的核心操作:取char*类型变量ptr的地址,强制转换为char*后,通过strcpy将字符串"UB?"(包含终止符共4字节)写入ptr的内存空间。下面从C标准规则逐一分析:

  • 严格别名规则的合法性:
    C标准明确允许用char/unsigned char/signed char类型的指针访问任意对象的内存,这是合法的类型双关场景。因此将&ptr转为char*并写入的操作,完全符合标准要求,不存在违规。

  • strcpy的越界风险:
    strcpy要求目标地址指向的空间足够容纳源字符串(含终止符)。这里的目标空间是ptr变量本身,大小为sizeof(char*):

    • 32位系统中,sizeof(char*)为4字节,刚好匹配"UB?"的4字节长度,无越界,操作合法。
    • 64位系统中,sizeof(char*)为8字节,写入4字节仅覆盖ptr的前半部分,未超出变量内存范围,同样合法。
    • 仅当sizeof(char*) < 4时(这类系统极为罕见),写入4字节会越界访问,此时才属于未定义行为。
  • 关于“只有解引用时才是UB”的说法:
    这个说法有一定道理,但需区分操作阶段:

    • 单纯执行这段strcpy操作,只要不发生越界,就不是未定义行为。
    • 但如果后续解引用修改后的ptr(比如执行*ptr = 'x';),则必然是未定义行为——因为ptr的值是从字符串字节构造的无效内存地址,访问该地址属于非法内存操作。

总结:这段代码中的strcpy操作本身,在绝大多数现代系统中不属于未定义行为;真正的未定义行为出现在后续解引用ptr的环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:43