通过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字节会越界访问,此时才属于未定义行为。
- 32位系统中,
关于“只有解引用时才是UB”的说法:
这个说法有一定道理,但需区分操作阶段:- 单纯执行这段
strcpy操作,只要不发生越界,就不是未定义行为。 - 但如果后续解引用修改后的
ptr(比如执行*ptr = 'x';),则必然是未定义行为——因为ptr的值是从字符串字节构造的无效内存地址,访问该地址属于非法内存操作。
- 单纯执行这段
总结:这段代码中的strcpy操作本身,在绝大多数现代系统中不属于未定义行为;真正的未定义行为出现在后续解引用ptr的环节。
内容的提问来源于stack exchange,提问作者Dean Lee
相关产品推荐
相关产品推荐

