C++ 知识点 - return 局部变量

C++中 return 局部变量。

参考资料

概念

函数执行完毕后,所指向的内存空间也随之被释放掉,所以函数终止意味着局部变量的引用将指向不再有效的内存区域。

但是如果函数的局部变量作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,所以函数不能返回局部变量的地址,因为系统回收后,如果还返回局部变量的地址的话,指针所指向的内容毫无意义。

具体例子如下:

#include <iostream>
using namespace std;

int test1(void)
{
  int a = 50;
  return a;
}
int *test2(void)
{
  int a = 100;
  int *p = &a;
  cout << "p的地址= " << p << endl;
  return p;
}
int main()
{
  int x = 10;
  x = test1();
  cout << "x= " << x << endl;
  int *p = NULL;
  p = test2();
  cout << "p= " << p << endl;
  cout << "*p= " << *p << endl;

  return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

执行结果:

x= 50
p的地址= 0x7ffea4e99de4
p= 0x7ffea4e99de4
*p= 32766

1
2
3
4
5

返回地址和内部局部变量地址虽然一样,但是所该地址已经被回收了,所以解引用的值是个不确定的值

总结

在主函数调用子函数时,首先程序会跳转到子函数的地址处,在子函数执行到最后return返回值时,系统会把需要返回的值存入寄存器中,然后经过函数体结尾的“}”后,子函数正式结束,在这个过程中,如果子函数有形参和局部变量,系统会为它们分配栈内存空间,等到函数运行完毕后,系统将会自动释放在栈内存中给局部变量分配的内存中的数据。所以说单纯的返回值不会有问题,但是如果要返回地址就会有问题。