访问无效指针并获取其地址

时间:2016-12-01 05:56:10

标签: c++ memory stl

考虑这样的代码:

std::vector<int> vec { 1, 2, 3 };
auto addr = &*vec.end();

或简化:

int* ptr = 0;
auto addr = &*ptr;

auto val = *ptr;显然会出现段错误。因此&*ptr不以相同的方式访问内存。为什么会这样?标准中是否有特定条目?

2 个答案:

答案 0 :(得分:5)

取消引用std::vector::end()的返回值是未定义行为的原因。如果你做的话,试图理解会发生什么是没有意义的。

来自http://en.cppreference.com/w/cpp/container/vector/end

  

此元素充当占位符;尝试访问它会导致未定义的行为。

重新。第二部分,我在C ++ 11标准中唯一能找到的是:

  

5.3.1一元运算符

     

1一元*运算符执行间接:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是左值引用表达式指向的对象或函数。如果表达式的类型是“指向T的指针”,则结果的类型为“T。”[注意:指向不完整类型的指针(除了 cv void)可以取消引用。由此获得的左值可以以有限的方式使用(例如,初始化参考);此左值不得转换为   prvalue,见4.1。 - 结束记录]

取消引用NULL指针的结果似乎未指定。

答案 1 :(得分:3)

在这两种情况下,您最终都会计算地址而不是访问内存,这就是您的代码正常工作的原因。但根据c ++标准,这两种情况都是未定义的行为。第一个示例实际上可能会在标准库的Debug版本中触发断言失败。