取消引用无效指针,然后获取结果的地址

时间:2011-09-08 10:33:52

标签: c++ pointers

考虑:

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

*有多么违法,因为它与直接&一起使用并且假设游戏中没有超载的op& / op*


(这对解决过去的数组元素&myArray[n]有特殊的影响,这个表达式明确等同于&*(myArray+n)This Q&A解决了更广泛的情况,但我不知道感觉它真的满足了上述问题。)

3 个答案:

答案 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)

合法。为什么不呢?您只是将一个值设置为指针,然后访问它。但是,手动分配值必须明确指定为未定义的行为,但这是一般规范可以说的最多。然后,您在某些嵌入式软件控制器中使用它,它将为您提供正确的内存映射值...