【问题标题】:returning static pointer to local variable from function从函数返回指向局部变量的静态指针
【发布时间】:2014-03-01 13:04:37
【问题描述】:

我发现此代码on web 为例,但我认为这是不正确的。返回自动变量的地址,这只是巧合,它有时可能会起作用:

返回一个指向被破坏的局部变量的指针,该变量成为无效的内存位置,是未定义的行为

我唯一的一点犹豫是指针是static,但我认为这没有任何改变,因为这是应该是static而不是指针的变量:局部变量将被破坏。你能确认或否认吗?

double *& showNumber()
{
    double n = 1550.85;
    static double *v = &n;
    return v;
}

int main(int argc, char *argv[])
{
    double sn = *showNumber();
    sn = *showNumber();
    //...
}

【问题讨论】:

  • static 会在您初始化它们后在整个程序期间持续存在,所以这对于 v 应该没问题,而不是 n

标签: c++ pointers reference static


【解决方案1】:

要明确定义此代码,nv 都需要为 static

现在,*showNumber() 具有 undefined behaviour,因为它取消了对 dangling pointer 的引用。

【讨论】:

  • 只有n 应该是静态的
  • v 也应该是静态的,因为这个函数的预期用途也是返回一个我认为的指针
  • @bolov:为什么会这样(记住 v 是通过引用返回的)?
  • 累了,没看到引用返回。你是对的
【解决方案2】:

您的代码仍有未定义的行为,因为退出函数后静态指针的值无效。指针所指的局部变量将被销毁,下次调用该函数时,该局部变量的地址可以不同。

你可以这样写你的函数

double * showNumber()
{
    static double n = 1550.85;
    return &n;
}

在这种情况下,返回的指针将包含相同的有效值。

【讨论】:

  • 在 C 中,代码 static double* v = &n;将是非法的,因为 &n 不是编译时常量。在 C++ 中,它是合法的;初始化在第一次使用静态变量时发生,并且只发生一次。所以即使你写 *v = 1.0; inside 该函数,它可能会在第二次调用时崩溃。
【解决方案3】:

一旦您初始化静态变量,它们就会在程序的整个过程中持续存在。 v 已准备就绪,但 不是 n 的地址。

【讨论】:

    【解决方案4】:

    如果指针和它的变量都是静态的,那么只有代码是可以的。否则局部变量无论如何都会死掉。

    【讨论】:

      【解决方案5】:

      独立于局部或全局,静态变量将一直存在到程序结束。 但是当我们返回该变量的值时,建议使用全局。因为静态本地可能会因线程而受到影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-13
        • 2010-10-02
        • 2023-04-09
        • 1970-01-01
        • 2016-10-25
        • 2020-08-04
        相关资源
        最近更新 更多