我们都知道,C++ 函数中是可以进行局部变量的返回的,返回局部变量时要注意不能返回指向栈内存的指针
!
这是因为局部变量
的作用域是函数内部,函数一旦执行结束,栈上的局部变量会进行销毁,内存得到释放。因此,如果函数返回的是该局部变量的值拷贝,这是没有问题的。但是如果返回的是局部变量的地址,那么返回的只是该局部变量指针的拷贝,而随着函数运行结束,该拷贝指针所指向的栈内存已经被释放,那么指向一个未知区域就会导致调用的错误。
具体看下面的例子:
#include <iostream>
using namespace std;
int* test_1(){
int d=2;
int c = d;
// return &d;
return &c;
}
int* test_2(){
int d[] = {1,2};
return d;
}
int* test_3(){
int d[] = {1,2};
int *t = d;
return t;
}
char* test_4()
{
char str[]="HelloJacky";
return str;
}
char* test_5()
{
char* str=(char*)"HelloJacky";
return str;
}
int* test_6(){
int a = 1;
int *b = &a;
return b;
}
int main(void)
{
int *p = 0;
cout << *test_1() << endl;
cout << *test_2() << endl;
cout << *test_3() << endl;
cout << *test_4() << endl;
cout << *test_5() << endl;
cout << *test_6() << endl;
}
编译会给出下面的提示:
也就是说 test_1, test_2, test_4,编译器都会警告,引用栈空间的地址(一定要避免这种情况)。
那么问题来了,为什么 test_3,test_6 没有警告呢?
因為test1,test2,test4他們都是直接返回指向內存的變量,編譯的時候語法分析到就提出警告,test3,test6都是間接的指向內存,編譯器沒有深層的分析語法,所有,沒有提出警告。
因為寫編譯器的人這麼判斷的.... 有時候可能你就是要回傳一個指標本身呢。
編譯器能做的是盡量給你警告,我覺得標準沒有規定test_3、test_6這樣的行為必須給警告。