考虑这样的代码:
std::vector<int> vec { 1, 2, 3 };
auto addr = &*vec.end();
或简化:
int* ptr = 0;
auto addr = &*ptr;
auto val = *ptr;
显然会出现段错误。因此&*ptr
不以相同的方式访问内存。为什么会这样?标准中是否有特定条目?
答案 0 :(得分:5)
取消引用std::vector::end()
的返回值是未定义行为的原因。如果你做的话,试图理解会发生什么是没有意义的。
来自http://en.cppreference.com/w/cpp/container/vector/end:
此元素充当占位符;尝试访问它会导致未定义的行为。
重新。第二部分,我在C ++ 11标准中唯一能找到的是:
5.3.1一元运算符
1一元
*
运算符执行间接:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是左值引用表达式指向的对象或函数。如果表达式的类型是“指向T
的指针”,则结果的类型为“T
。”[注意:指向不完整类型的指针(除了 cvvoid
)可以取消引用。由此获得的左值可以以有限的方式使用(例如,初始化参考);此左值不得转换为 prvalue,见4.1。 - 结束记录]
取消引用NULL指针的结果似乎未指定。
答案 1 :(得分:3)
在这两种情况下,您最终都会计算地址而不是访问内存,这就是您的代码正常工作的原因。但根据c ++标准,这两种情况都是未定义的行为。第一个示例实际上可能会在标准库的Debug版本中触发断言失败。