c++ - 返回局部变量的引用

标签 c++ reference local-variables return-by-reference return-by-value

<分区>

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

f2() 预计会很好地工作,因为本地初始化变量。值从堆栈传递到 main。

f1() 预计不会工作,因为局部变量的引用在函数范围之外是无用的。但是,这两个函数的输出似乎都可以。

这是测试代码;

#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
}

输出结果如下;

f1: 10
f2: 5

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

最佳答案

超出范围访问局部变量是未定义的行为。未定义的行为意味着程序可能会运行,可能会出现段错误,可能会打印垃圾值,等等。

底层原因1是局部变量位于堆栈上。堆栈属于进程的可写地址空间(至少在大多数(如果不是全部)像您这样的操作系统上)。程序可能会随心所欲地写入它。 但是,C++ 不支持写入堆栈。 C++ 只定义局部变量,不定义调用帧或返回地址。它驻留在更高的抽象层次上。我所知道的唯一支持直接写入堆栈的语言是汇编语言。


1 C++标准没有以任何方式指定这个原因。

关于c++ - 返回局部变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33235206/

相关文章:

c++ - Lapack 链接错误,使用 -fPIC 重新编译

c++ - set object = null 在 C++ 中的替代方法是什么,比如 C#

PHP - 通过引用传递可变数量的参数

arrays - 如何在 Scala 中获得 Ponter/Reference 语义

c# - 在 C# 中使用 'unnecessary' 局部变量的性能损失?

ruby - 未执行的代码覆盖局部变量

c++ - 优化直方图更新

java - 如何发送列表的值而不是引用(其中列表是 map 的值)?

java - ByteBuddy - 如何添加局部变量

c++ - 系统与 ShellExecute - 差异?