考虑:
int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
*
有多么违法,因为它与直接&
一起使用并且假设游戏中没有超载的op&
/ op*
?
(这对解决过去的数组元素&myArray[n]
有特殊的影响,这个表达式明确等同于&*(myArray+n)
。This Q&A解决了更广泛的情况,但我不知道感觉它真的满足了上述问题。)
答案 0 :(得分:18)
根据规范,解除引用无效指针本身的效果会产生未定义的行为。在解除引用之后你做什么并不重要。
答案 1 :(得分:16)
假设变量`ptr'不包含指向有效对象的指针,如果程序需要对表达式`* ptr'进行左值到右值的转换,则会发生未定义的行为,如[conv.lval]中所指定的(ISO / IEC 14882:2011,第82页,4.1 [#1])。
在评估`&amp; * ptr'期间,根据[expr.unary.op](ISO / IEC 14882:2011,程序)不需要对子表达式`* ptr'进行左值到右值的转换。第109页,5.3.1 [#3])
因此,这是合法的。
答案 2 :(得分:2)
合法。为什么不呢?您只是将一个值设置为指针,然后访问它。但是,手动分配值必须明确指定为未定义的行为,但这是一般规范可以说的最多。然后,您在某些嵌入式软件控制器中使用它,它将为您提供正确的内存映射值...