繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM