[英]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都是范围级变量。 因此,返回仅存在于堆栈中的变量的地址(但未在堆上动态分配)是未定义的行为。 因为一旦离开那个地址空间,我们就不再知道写到那里的东西了。 因此,返回指向局部变量的指针是未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.