解引用一个无效的指针,然后取出结果的地址

考虑:

int* ptr = (int*)0xDEADBEEF; cout << (void*)&*ptr; 

如果*非法,那么它被用于立即&并且在没有超载op& op*在使用?


(这对于处理过去结束的数组元素&myArray[n]具有特别的影响,这个expression式&*(myArray+n)显式等价, 这个问答处理了更广泛的情况,但是我并不觉得它真的满足了上面的问题。)

假设variables`ptr'不包含指向有效对象的指针,如果程序需要按照[conv.lval]中指定的方式将expression式'* ptr'进行左值到右值转换,则会发生未定义的行为(ISO / IEC 14882:2011,第82页,4.1 [#1])。

在评估'&* ptr'时,根据[expr.unary.op](ISO / IEC 14882:2011,第109页,5.3),程序不需要对子expression式'* ptr'进行左值到右值的转换.1 [#3])

因此,这是合法的。

根据规范,解引用无效指针本身的效果会产生未定义的行为。 取消引用 ,您所做的并不重要。

合法的。 为什么不呢? 你只是设置一个指针的值,然后访问它。 然而,手工赋值必须明确指定为未定义的行为,但是这是最通用的规范可以说的。 然后,你在一些embedded式软件控制器中使用它,它会给你一些设备的正确的内存映射值…