我读到过不应该返回指向局部变量的指针或引用。因此在下面给出的例子中,我明白当我在函数foo中写入
我的问题是,对于函数
特别地,我知道
PS:我可能在描述第一个
return f;
时,我正在返回一个指向局部变量的指针。在函数外使用该指针将导致未定义行为。#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 "fsfs";
是否也适用于同样的情况。我知道在C++17中有强制复制优化。因此我的问题针对所有现代C++版本(C++11、C++17等)。行为是否依赖/在不同的C++版本中有所不同。特别地,我知道
main
函数内的语句std::cout<<f<<std::endl;
总是未定义行为,因为我们正在使用指向局部变量的指针(悬挂指针)。但是语句std::cout<<ptr;
是否也会导致未定义行为。如果不会,那么为什么?这里会发生什么。PS:我可能在描述第一个
cout
语句时描述错误了。如果我错了,请纠正我。此外,我的原意并不限于特定类型,比如字符串字面量。例如,我可以选择返回一个int
而不是字符串字面量,并将返回类型设置为const int&
。但既然已经有人开始回答了,我就不改变例子来使用int
了。
return &f;
,那就是返回一个指向本地变量的指针了。 - Raymond Chen