如何解释这种奇怪的输出?关于指针和临时变量

How to explain this strange output? About pointer and temporary variable

本文关键字:于指针 指针 变量 解释 何解释 输出      更新时间:2023-10-16

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

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;
}

返回对函数局部变量的指针/引用会导致未定义的行为。局部/自动变量保证只在定义它的作用域({})中有效,不超出该作用域。

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

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

虽然使用这样的指针是错误的,但我仍然想 了解它为什么会以这种方式行事。

因为 p 指向堆栈内存中的一个位置,该位置不断被 cout 的 <<方法覆盖。 每次使用 cout 时,p 的值都可能会发生变化。

像这样的代码很危险,因为它会损坏堆栈并导致程序崩溃。

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