如何解释这种奇怪的输出?关于指针和临时变量
How to explain this strange output? About pointer and temporary variable
谁知道为什么输出是这样的?
尽管使用这样的指针是错误的,但我仍然想了解为什么它的行为方式如此。
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 都是作用域级别的变量。因此,返回仅存在于堆栈中(但不在堆上动态分配)的变量的地址是未定义的行为。因为一旦它离开了地址空间,我们就不再知道写入那里的内容。因此,返回指向局部变量的指针是未定义的行为。
相关文章:
- c++r值引用应用于函数指针
- C++:将值 int(例如:0x00AAFAD8)转换为指针(指针本身也是 0x00AAFAD8 值)
- 互斥锁能否保护相对于特定指针的数据?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 未分配正在释放的指针 - 指针问题
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 指针?指针功能
- 简单的功能大小;了解指针-指针差异
- 当我删除指针指针时会发生什么
- 将向量向量转换为指针指针
- 理解c++中的指针指针以获得函数调用
- 在指针指针中更改价值
- 指针指针,动态内存分配
- 如何在不取消引用指针的情况下返回指针指针值?
- 指针指针:std:vector vs. 数组
- 使用引用相对于使用指针的优势是否证明偶尔"null-references"是合理的?
- 如何使函数不使用STL容器参数(类似于空指针)
- lambda对象相对于函数指针转换的生命周期
- 模板仅适用于智能指针
- delete[]操作符是否适用于通过指针返回的动态分配的内存?