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