1

谁知道为什么输出是这样的?
尽管使用这样的指针是错误的,但我仍然想了解它为什么会这样。

int* foo()
{
    int a=9;
    int *p=&a;
    //definitely not right to return a pointer to an invalid varible
    return p;
}
int main(int argc, char* argv[])
{
    int *p=foo();
    cout<<*p<<endl;//9
    cout<<*p<<endl;//2357228
    *p=2;
    cout<<*p<<endl;//2
    (*p)++;
    cout<<*p<<endl;//2357229
    cout<<*p<<endl;//2357228
    cout<<*p<<endl;//2357228
    (*p)++;
    cout<<*p<<endl;//2357229
    cout<<*p<<endl;//2357228

    return 0;

}
4

3 回答 3

2

返回指向函数局部变量的指针/引用会导致未定义的行为。本地/自动变量保证仅在定义它的范围({, })内不超出该范围是有效和有效的。

未定义的行为意味着程序可以显示任何行为,并且C/C++标准允许这样做。在未定义的行为发生后试图寻找观察到的行为的推理是没有意义的,因为这种行为可能/可能不一致或不能依赖。

从好的方面来说,任何好的商业编译器都会为您提供有关此类代码的警告。

于 2012-10-24T03:26:19.243 回答
1

尽管使用这样的指针是错误的,但我仍然想了解它为什么会这样。

Because p is left pointing at a location in stack memory that keeps getting written over by cout's << method. Every time you use cout, the value of p may change.

Code like this is dangerous as it can corrupt the stack and cause your program to crash.

于 2012-10-24T03:39:50.063 回答
0

您需要记住的是 a 和 p 都是范围级别的变量。因此,返回仅存在于堆栈中(但不是在堆上动态分配)的变量的地址是未定义的行为。因为一旦离开那个地址空间,我们就不再知道什么会被写入那里。因此,返回指向局部变量的指针是未定义的行为。

于 2012-10-24T03:20:10.907 回答