Vladimir Gamalyan Asked:2020-08-15 22:06:33 +0000 UTC2020-08-15 22:06:33 +0000 UTC 2020-08-15 22:06:33 +0000 UTC 将局部变量的地址分配给自身 772 需要获取局部变量的地址,并将其存储在同一个变量中。这段代码是否正确: void* p = (void*) &p; GCC正常消化。这里是否可能存在 UB 或违规行为strict aliasing? 而且在这个版本中: int* p = (int*) &p; 意念 c++ 1 个回答 Voted Best Answer Abyx 2020-08-15T22:37:52Z2020-08-15T22:37:52Z 的代码void*是正确的,因为 类型void**转换为void*. 代码int* p = (int*) &p;本身是正确的,因为 虽然它&p有 type int**,但它可以转换为int*via reinterpret_cast(在这种情况下是 C 风格的转换)。 但是,您不能取消引用p,因为 这将违反alising的规则:p它实际上指向一个类型的对象int*,并且表达式*p将该对象视为int. (当然,reinterpret_cast由于 的规则,这个结果不能被取消引用reinterpret_cast,但问题是关于别名的。)
的代码
void*
是正确的,因为 类型void**
转换为void*
.代码
int* p = (int*) &p;
本身是正确的,因为 虽然它&p
有 typeint**
,但它可以转换为int*
viareinterpret_cast
(在这种情况下是 C 风格的转换)。但是,您不能取消引用
p
,因为 这将违反alising的规则:p
它实际上指向一个类型的对象int*
,并且表达式*p
将该对象视为int
.(当然,
reinterpret_cast
由于 的规则,这个结果不能被取消引用reinterpret_cast
,但问题是关于别名的。)