本地指针发生了什么变化?

时间:2011-07-25 02:28:31

标签: c++ pointers

我的问题在下面的代码段中的代码注释中标记。

int *foo(){
    int a = 10;
    int b = 20;
    return &b;
}
int *foo2(){
    int aa = 44;
    int bb = 40;
    return &bb;
}

int main(int argc, char* argv[])
{
    int *p = foo();
    int *p2 = foo2();

    int  a = 700;
    int *b = & a;

//  cout<<*b<<endl; /* what & why the difference from adding & removing this line?? */
    cout<<a<<endl;
    cout<<*p<<endl; /* what & why happened to "p" */

    return 0;
}

2 个答案:

答案 0 :(得分:5)

foo()foo2()中,您将返回指向局部变量的指针。这些本地人具有自动存储,并且未定义行为一旦超出范围就使用指向它们的指针。因此pp2没有任何用处。它可能有效,但可能没有。

我无法理解你的问题,所以我希望我能得到这一切。

答案 1 :(得分:1)

在我尝试回答您的代码段评论中的问题之前,让我们逐步完成:

int *foo(){
    int a = 10;
    int b = 20;
    return &b;
}
int *foo2(){
    int aa = 44;
    int bb = 40;
    return &bb;
}

int main(int argc, char* argv[])
{
    int *p = foo();
    int *p2 = foo2();

foo()foo2()中,您将返回指向函数调用堆栈中某些内容的指针(即ab,{{1 }}和aa),当函数返回时会消失。在函数内,指向bb中变量ab的指针或指向foo()中变量aabb的指针将指向某事物有效的。

但是当函数返回时,这些变量将不复存在。因此,在这两个函数中,返回的指针都无效,因此foo2()p也将无效。

p2

您要将变量 int a = 700; int *b = &a; 的地址指定给指针a

b

添加该行将取消引用// cout<<*b<<endl; /* what & why the difference from adding & removing this line?? */ 并打印出指针的值(在本例中,变量b的值为700)。

a

由于 cout<<*p<<endl; /* what & why happened to "p" */ 无效,如前所述,它将调用未定义的行为,这意味着任何都可能发生。这可能包括它正常工作(我怀疑),打印垃圾值,直接崩溃或爆炸您的计算机。只是不要试图取消引用无效指针。