知识 - C++中 return 局部变量
C++中 return 局部变量。
参考资料
概念
函数执行完毕后,所指向的内存空间也随之被释放掉,所以函数终止意味着局部变量的引用将指向不再有效的内存区域。
但是如果函数的局部变量作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,所以函数不能返回局部变量的地址,因为系统回收后,如果还返回局部变量的地址的话,指针所指向的内容毫无意义。
具体例子如下:
DETAILS
#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
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
2
3
4
5
返回地址和内部局部变量地址虽然一样,但是所该地址已经被回收了,所以解引用的值是个不确定的值
总结
在主函数调用子函数时,首先程序会跳转到子函数的地址处,在子函数执行到最后return返回值时,系统会把需要返回的值存入寄存器中,然后经过“}”,子函数正式结束,在这个过程中,如果子函数有形参和局部变量,系统会为它们分配栈内存空间,等到函数运行完毕后,系统将会自动释放在栈内存中给局部变量分配的内存中的数据。所以说单纯的返回值不会有问题,但是如果要返回地址就会有问题。