首页 > 试题广场 >

在linux+gcc下,关于以下代码,正确的是()

[不定项选择题]
在linux+gcc下,关于以下代码,正确的是()
std::string& test_str(){
   std::string str = "test";
   return str;
}
int main(){
   std::string& str_ref = test_str();
   std::cout << str_ref << std::endl;
   return 0;
}
  • 编译警告
  • 返回局部变量的引用,运行时出现未知错误
  • 正常编译且运行
  • 把代码里的&都去掉之后,程序可以正常运行
B选项有问题,运行时并未产生未知错误
发表于 2020-08-17 14:33:16 回复(0)
对于D选项,简要说明一下:
D选项,去掉&后其实就是我们见到的最基本的返回值问题,其返回值为局部变量。
其实问题就变成了为什么不能返回局部变量地址,却可以返回局部变量?
  1. 局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收;
  2. 函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针、引用指向的内容就无意义了。
编辑于 2017-08-22 11:58:50 回复(0)
引用返回的是局部变量本身,而不是复制一份再返回,所以结果难以预料;其次返回局部自动变量是可以的,只要不是地址或引用就可以,否则需要将变量声明成static类型。
编辑于 2016-08-27 14:58:41 回复(1)
在我的电脑下 ubuntu 14.0下,出现编译警告 ,提示“返回局部变量引用”,故A选项也应该对!

发表于 2016-03-20 21:53:09 回复(1)
感觉A选项应该也是对的。
因为返回的局部变量的引用 编译是会出现警告的。
另外 B D两个选项也是对的。
发表于 2015-12-28 23:27:10 回复(4)
c++中string是一个类,去掉&后return时会调用复制构造函数,因此是可以得到所要的内容。
发表于 2017-03-07 09:16:49 回复(1)
函数返回局部变量的复制,如果是返回引用那么就是返回变量本身,本身被销毁后无法预测。同理不能返回局部变量的地址。
编辑于 2017-09-04 01:09:32 回复(0)
 返回局部变量引用或地址时,调用程序后,局部变量被销毁,再去访问时该变量存储的值已经不存在了,所以会出现未知错误
如果返回局部变量的值,这样会生成个拷贝用作返回值,并赋值给全局变量,即使局部变量被销毁,全局变量还是可以访问
发表于 2019-03-27 10:17:46 回复(0)
注意 实际情况中D会被RVO优化 不会拷贝
编辑于 2020-03-01 14:09:56 回复(0)
我如果关闭g++警告呢
发表于 2023-09-26 17:10:26 回复(0)
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

test_string_reference.cpp: In function ‘std::string& test_str()’:
test_string_reference.cpp:5:11: warning: reference to local variable ‘str’ returned [-Wreturn-local-addr]
    5 |    return str;
      |           ^~~
test_string_reference.cpp:4:16: note: declared here
    4 |    std::string str = "test";
      |                ^~~


发表于 2023-09-21 11:11:11 回复(0)
函数里局部变量或者常量的地址以及引用不能作为返回值 因为函数结束后 该局部值就会被释放 地址或引用的指向将变得没有意义
发表于 2023-02-19 17:55:38 回复(0)
不是编译会出错么,为什么A选项也对?
发表于 2022-06-14 17:52:26 回复(0)
D选项,去掉&后其实就是我们见到的最基本的返回值问题,其返回值为局部变量。 其实问题就变成了为什么不能返回局部变量地址,却可以返回局部变量? 局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收; 语义上这样做是没有意义的,编译也会报错 函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针、引用指向的内容就无意义了
发表于 2021-10-26 13:38:27 回复(0)
正常编译且运行也没有什么不对
发表于 2021-05-07 19:44:20 回复(0)
我选了C
发表于 2021-03-23 14:47:57 回复(0)
我TM以为是单选
发表于 2021-02-18 11:44:22 回复(0)
返回局部变量的reference只是编译告警啊。。以为是error
发表于 2021-01-15 20:20:58 回复(0)

在Linux下的结果如上,在cmake时候就有warning出现:引用局部变量;但是将&去掉之后,编译通过,结果如下。
编辑于 2020-02-21 21:17:08 回复(0)
hh
发表于 2018-10-04 23:05:15 回复(0)