首页 文章

返回C中局部变量的引用[重复]

提问于
浏览
-2

可能重复:C返回对局部变量的引用可以在其范围之外访问局部变量的内存吗?

在以下代码中

int& h() {

int o=100;
return o; 
}

int main() {
int t=h();     //line 1
cout<<t;     //line 2
return 0;
}

为什么输出为100,即函数的局部变量的值以及为什么第1行没有错误,因为函数的返回类型是int&但我们将其返回值返回到int .

5 回答

  • 1
    • 永远不应该返回引用或指向局部变量的指针 . 它会在函数返回时被销毁 . 它可能在某些情况下起作用,因为堆栈可能尚未被覆盖 . 但它最终会意外失败 .

    • 将某事物的引用分配给相同类型的值是合法的 . 因此,在您的作业中,会制作副本 .

  • 2

    该值为100,因为包含它的内存刚刚被释放,没有人写任何内容 . 这是另一个例子:

    int& h() {
    
        int o=100;
        return o; 
    }
    
    int& h2() 
    {
        int o = 10;
        return o;
    }
    
    int main() {
        int t=h() + h2();     //line 1
        cout << t;
        return 0;
    }
    

    如果你在Visual Studio上没有优化编译它,结果将是20,这将是会发生什么:

    调用

    • h(),将100写入内存,释放它并返回引用 .

    • h2()被调用并写入10 to the same place in memory (之前已被释放)

    • main()计算内存中相同位置的2个值的总和 . 因此,它是10 10 .

    int & 设置 int 不是错误 . 这是一个有效的操作,意思是"take this reference to some object and copy whatever is there to my local variable" .

  • 5

    返回引用局部变量 - 对于Ivan /的单线程应用/示例是没有问题的 . 对于多线程应用程序是个问题 - 当不同的线程使用函数时,例如H() . 在这种情况下,当线程交叉使用未分配内存时可能是片刻 .

  • 2

    编译器不一定能防止错误和/或未定义的行为 .

  • 1

    检查您传递给编译器的选项 .

    在codepad.org上编译代码会产生警告:http://codepad.org/ParI4AOG

    In function 'int& h()':
    Line 6: warning: reference to local variable 'o' returned
    

相关问题