任何人都可以解释为什么这两个“结果”是不同的?

时间:2014-10-21 12:58:12

标签: c++ reference return

我有这段代码:

#include <iostream>    
using namespace std;    

int & squareRef(int );    

int main() {  
   int number1 = 8;    
   cout <<  "In main() &number1: " << &number1 << endl;     
   int & result = squareRef(number1);   
   // cout <<  "In main() &result: " << &result << endl;    
   cout << result << endl;   
   cout << result << endl;   
   cout << number1 << endl;
}    

int & squareRef(int  rNumber) {   
   cout <<  "In squareRef(): " << &rNumber << endl;      
   rNumber *= rNumber;    
   return rNumber;    
}   

程序产生以下输出:

In main() &number1: 0x28ff08    
In squareRef(): 0x28fef0    
64    
1875681984      
8    

任何人都可以解释为什么这两个&#34;结果&#34;是不同的,假设是相同的不是?

1 个答案:

答案 0 :(得分:4)

通过返回对局部变量的引用来调用未定义的行为:

test.cc:19:7: error: reference to local variable ‘rNumber’ returned [-Werror=return-local-addr]
 int & squareRef(int  rNumber) {   

将rNumber复制到堆栈中以进行呼叫。调用之后,堆栈上的值未定义,并且可能会因后续调用而发生变化。您返回的引用仅指向堆栈中的该位置,并且不包含实际值。

通常,当这些事情发生时,打开编译器可以给你的所有警告是非常有帮助的。使用gcc,标志-Wall -Wextra -Werror为您提供了许多有用的警告,例如这些警告。通常,代码应该编译而不抛出任何警告(除了函数存根中可能未使用的变量/参数,尽管有明确跳过这些的宏)。