C++中return局部变量

函数完成后,所指向的内存空间也随之被释放掉,所以函数终止意味着局部变量的引用将指向不再有效的内存区域,但是如果函数的局部变量作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,所以函数不能返回局部变量的地址,因为系统回收后,如果还返回局部变量的地址的话,指针所指向的内容毫无意义。具体看如下例子:

int test0(void)
{
	int a = 50;
	return a;
}
int* test1(void)
{
	int a = 100;
	int *p = &a;
	cout << "p的地址= " << p << endl;
	return p;
}
int main()
{
	int X= 10;
	X= test0();
	cout << "X= " << X<< endl;
	int *P = NULL;
	P = test1();
	cout << "P= " << P << endl;
	cout << "*P= " << *P << endl;
	system("pause");
	return 0;
}

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

再看一个例子:

char* test0()
{
	static char p[] = "this is test0\n";   
	return p;    
}
char* test1()
{
	char *p = "this is test1\n";   
	return p;    
}
int main()
{
    printf("%s\n", test0());
    printf("%s", test1());
	return 0;
}

结果这里都会正常返回,这是因为这里test0保存在静态存储区,test1保存在只读常量区,不在通常所说的栈内存中,所以返回这个地址不会被回收,会正常返回原来的值。

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

参考学习博客:

https://blog.csdn.net/wangshubo1989/article/details/50286985

https://blog.csdn.net/u014077947/article/details/77861896

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值