返回指向局部变量的指针总是未定义的行为

Is returning a pointer to a local variable always undefined behavior

我读到我们不应该 return 指针或对局部变量的引用。所以在下面给出的例子中,我明白当我写: return f; inside function foo 时,我正在 returning 一个指向局部变量的指针。在函数外部使用该指针将导致未定义的行为。

#include <iostream>

const char* foo()
{
    const char* f = "ffdf";
    return f;//returning pointer to a local variable
}

const char* func()
{
    return "fsfs";
}

int main()
{
    const char* ptr = func();
    const char* f = foo();
    std::cout<<f<<std::endl; //I know this is undefined behavior because we're using a pointer that points to a local variable 
    std::cout<<ptr; //But IS THIS UNDEFINED BEHAVIOR too?
}

我的问题是函数 func 中的 return 语句 return "fsfs"; 也是如此。我知道在 C++17 中有强制复制 elison。所以我的问题是针对所有现代 C++ 版本(C++11、C++17 等)。 C++ 版本上的行为 depends/differs。

特别是,我知道 main 中的语句 std::cout<<f<<std::endl; 始终是未定义的行为,因为我们使用的是指向局部变量的指针(悬挂)。但是语句 std::cout<<ptr; 是否也会导致未定义的行为。如果不是为什么以及这里会发生什么。

PS:我在描述第一个 cout 语句中实际发生的事情时也可能是错误的。所以如果我错了请纠正我。此外,我的初衷并不局限于特定类型,如字符串文字。例如,我可以选择 return 一个 int 而不是字符串文字,并将 return 类型设为 const int&。但由于人们已经开始回答,我不会更改示例以使用 int.

返回指向 non-static 函数局部变量的指针将导致您在调用站点获得的指针成为悬空指针,使用它会产生未定义的行为。

在这里,情况并非如此。字符串文字具有静态存储持续时间,这意味着它将一直存在到程序结束。这意味着 return 指向函数中声明的字符串文字的指针是安全的。

所以 foofunc 都是安全的,但是如果你

const char * bar()
{
    std::string text = "some text";
    // stuff
    return text.c_str();
}

然后您将 return 指向不再存在的对象的指针,并且 UB 会尝试从该 returned 指针读取。