怎么了?指针?

时间:2012-01-03 15:51:25

标签: c++

  

可能重复:
  Returning the address of local or temporary variable
  Can a local variable's memory be accessed outside its scope?

#include<iostream>
using namespace std;

int *p = NULL;

void 
fun(void){
    int i = 10;
    p = &i;
}

int 
main(void){
    fun();
    cout<<*p<<endl; //#1
    cout<<*p<<endl; //#2
    return 0;
}

我认为#1和#2输出相同,但为什么#1输出10和#2输出一个随机数?

5 个答案:

答案 0 :(得分:8)

这只是未定义的行为。在该变量超出范围之后,您正在使用指向局部变量的指针。任何事情都可能发生。

答案 1 :(得分:3)

这确实是一个悬垂的指针。

您正在指定p指向自动(本地)对象。一旦fun返回,该对象就不再存在,并且尝试通过p访问它会产生未定义的行为。

如果您对观察特定行为的原因感兴趣:在大多数平台上,fun的堆栈帧仍将存在,直到调用另一个函数。因此,首次调用p时,阅读<<很可能会找到i的旧值。调用<<后,旧堆栈帧很可能被覆盖,因此读取p将找到任意值。但这些都不是你可以依赖的行为;访问死对象可能会导致崩溃或任何其他行为。

答案 2 :(得分:1)

是的,pfun()返回的那一刻成为悬空指针。

答案 3 :(得分:1)

您正在保存指向超出范围的变量的指针。因此,behavior is undefined。它可以打印任何内容,甚至可以使应用程序崩溃。甚至让你的电脑爆炸。

答案 4 :(得分:1)

你的函数正在返回指向被覆盖的东西的指针:

int i = 10;
p = &i; // This line

因为i是一个局部变量。