【问题标题】:Return by value, and by address按值和地址返回
【发布时间】:2017-02-27 07:10:52
【问题描述】:
#include <iostream>

int Value ()
{
     int x = 90;//creates a variable x
     return x;//returns the value x, into the caller
     //x is destroyed because it is out of scope
}

int * ptr ()
{
     int x = 7;//creates variable x
     return &x;//returns a pointer to x
     //x gets destroyed because it is out of scope
}

主函数内部

      int y = Value ();// y = 7

      int *py = ptr ();
      /* *py = 7, not Undefined Behaviour?? */

我创建了这段代码,在调试程序时,我在我的监视窗口中 *py = 7。 我不应该得到一个未定义的行为,并且程序崩溃,因为 py 指向一个现在有垃圾的地址(ptr() 中的 x 超出范围)

【问题讨论】:

  • UB 的问题是其中一种可能性是它似乎可以工作。尝试更改调用顺序,您很可能会在调用Value 后看到*py 更改值。
  • 我现在做了,它给了我 0。谢谢
  • 这也是非常依赖编译器和操作系统的。这就是 undefined-behavior 的含义,因为它是由实现定义的,而不是保证在任何情况下都能正常工作。

标签: c++ pointers return-value


【解决方案1】:

函数 ptr 返回一个值,即局部变量 x 的地址。当您结束函数时,内存模型仅将此地址 (&x) 标记为可写,但不会删除内存中的实际值。 因此,当您查看内存地址 py 的实际值时,您会看到值 7,但当另一个函数请求一些内存时,它可能会被更改。

【讨论】:

    【解决方案2】:

    我不应该得到一个未定义的行为

    是的。这就是你得到的。

    不应该……程序崩溃

    没有。该标准没有定义程序必须崩溃。相反,行为是未定义的。

    【讨论】:

      【解决方案3】:

      它变成了dangling pointer。如果使用会导致问题。

      【讨论】:

        猜你喜欢
        • 2021-09-29
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        相关资源
        最近更新 更多