即使将指针本身的内存空间用作指针以外的类型,那不是UB吗?

问题描述 投票:0回答:1

我知道这是个奇怪的问题,但只是很好奇。

char* ptr = 0;
strcpy( (char*) &ptr, "UB?");

这段代码的意思是“我将使用 ptr 的内存作为 char 数组。” 我认为“这绝对是 UB”,但有人说“除非你取消引用,否则它不是 UB”。 这不是UB吗?这么糟糕的代码怎么能不UB呢?

c undefined-behavior
1个回答
0
投票

C17 §6.5 第 6 段包括:

访问其存储值的对象的“有效类型”是该对象的声明类型(如果有)。 [...]

ptr

表示的对象的有效类型是

char *
第 7 段包括:

对象的存储值只能由具有以下类型之一的左值表达式访问:

与对象的有效类型兼容的类型,
  • 与对象的有效类型兼容的类型的限定版本,
  • 一个类型,即与对象的有效类型对应的有符号或无符号类型,
  • 与对象有效类型的限定版本相对应的有符号或无符号类型的类型,
  • 在其成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的成员),或者
  • 字符类型。
ptr

表示的对象的存储值由

char
类型的左值表达式访问(通过
strcpy
函数)。这不是UB。
    

© www.soinside.com 2019 - 2024. All rights reserved.