解引用一个无效的指针,然后取出结果的地址
考虑:
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式软件控制器中使用它,它会给你一些设备的正确的内存映射值…