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

Lig*_*ica 23 c++ pointers

考虑:

int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
Run Code Online (Sandbox Code Playgroud)

*如果它与一个立即使用&并且假设没有超载op&/ 在场,那么它是多么违法op*


(这对解决过去的数组元素有一个特殊的影响&myArray[n],这个表达式明确相当于&*(myArray+n).这个Q&A解决了更广泛的情况,但我不觉得它真的满足了上面的问题.)

Naw*_*waz 18

根据规范,解除引用无效指针本身的效果会产生未定义的行为.解除引用它你做了什么并不重要.

  • @Oli:有趣的是,C99在脚注中说出了"因此"这个词.它并不认为它会添加一个特殊情况来允许`&*`(并且它提到"即使是一个空指针"而不是"甚至是指向非指针").它认为规范部分中陈述的内容*逻辑上暗示*即使对于空指针,`&*`也是无操作.有趣的是,我怀疑那个编写脚注的人会从C++标准中得出同样的含义,即如果没有运算符重载,那么`&*`就是无操作. (3认同)
  • @SteveJessop:实际上,C使`&*`成为一个特例(在描述`&`的段落中).C++没有做出这种区分,但是,我无法在标准中的任何地方明确地找到解除引用空指针(没有后续的左值到右值的转换)是未定义的行为(尽管在几个注释中提到过). (2认同)

chi*_*ill 16

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

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

因此,这是合法的.

  • 是,5.3.1一元运算符[#3]"一元&运算符的结果是指向其操作数的指针.__操作数应为左值或限定符.__" (2认同)