首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >返回局部变量的引用

返回局部变量的引用
EN

Stack Overflow用户
提问于 2015-10-20 03:15:48
回答 1查看 1.2K关注 0票数 1

在下面的代码中,将演示两个函数。f1()返回函数作用域中初始化局部变量的引用,f2()返回函数作用域中初始化局部变量的值。

f2()应该运行良好,因为本地初始化变量。值从堆栈传递到主值。

f1()不能工作,因为局部变量的引用在函数范围之外是无用的。但是,对于这两个函数,输出似乎都正常。

这是测试代码;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

// function declarations
int& f1();
int f2();

int main()
{
    cout << "f1: " << f1() << endl; // should not work!
    cout << "f2: " << f2() << endl; // should work

    return 0;
}

int& f1()       // returns reference
{
    int i = 10; // local variable

    return i;   // returns reference
}

int f2()        // returns value
{
    int i = 5;  // local variable

    return i;   // returns value
}

输出如下;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f1: 10
f2: 5

为什么f1()工作正常,即使f1()返回局部变量的引用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-20 03:19:37

欢迎来到未定义行为

你就是这么做的。您可以访问超出作用域的变量。然而,这可能是因为系统没有在已经存在的值上写一些东西,从而解释了这种行为。

这就是为什么在实际代码中很难找到这样的逻辑错误的原因。因为您可能(Un)幸运,并且变量具有正确的值(在特定的执行中)。

因此,f1()的返回值是对超出范围的东西的引用,而f2()的返回值是该函数局部变量的副本,这是可以的。

但是,下降编译器应该对此发出警告,并发出这样的警告:

警告:引用局部变量‘i’返回-返回-本地-addr

请在编译器中启用警告标志。:)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33235206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文