从函数返回本地变量的静态指针

3
我发现这段代码在网上作为示例,但我认为这是不正确的。返回自动变量的地址,这只是偶然性,有时可能会工作:
返回指向已销毁的局部变量的指针,导致无效内存位置,是未定义的行为。
我唯一的小犹豫是关于指针是否为静态的,但我认为这并没有改变什么,因为应该是变量而不是指针:局部变量将被销毁。您能否确认或否定?
double *& showNumber()
{
    double n = 1550.85;
    static double *v = &n;
    return v;
}

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

静态变量在初始化后整个程序的持续时间内都会保留,因此对于v来说这应该是可以的,但不适用于n。 - Marco A.
5个回答

2

你的代码仍存在未定义行为,因为静态指针的值在退出函数后无效。由指针引用的局部变量将被销毁。每次调用该函数时,此局部变量的地址可能不同。

你可以按照以下方式编写函数:

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

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

在C语言中,代码static double* v = &n; 是非法的,因为&n不是编译时常量。但在C++中是合法的,初始化发生在静态变量第一次使用时,并且只发生一次。因此,即使你在函数内部写了*v = 1.0;,它也很可能在第二次调用时崩溃。 - gnasher729

2

为了使这段代码定义良好,nv都需要是static的。

当前,*showNumber()存在未定义行为,因为它解除引用一个悬空指针


只有 n 应该是静态的。 - bolov
v应该也是静态的,因为该函数的预期使用也是返回指针。 - 4pie0
@bolov:考虑到 v 是通过引用返回的,那为什么会这样呢? - NPE
我很累,没有看到按引用返回。你是对的。 - bolov

1
静态变量一旦初始化,就会在整个程序运行期间持续存在。对于v而言, 你已经准备好了,但对于n的地址却没有。

0
如果指针和它的变量都是静态的,那么代码才能正常运行。否则局部变量无论如何都会消失。

0

无论是局部的还是全局的,静态变量都会一直存在到程序结束。 但建议在返回该变量的值时使用全局变量,因为静态局部变量可能会受线程影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接