我有这段代码:
#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;是不同的,假设是相同的不是?
答案 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
为您提供了许多有用的警告,例如这些警告。通常,代码应该编译而不抛出任何警告(除了函数存根中可能未使用的变量/参数,尽管有明确跳过这些的宏)。