#C++ 函数返回局部变量问题
函数返回局部变量有以下几种情况:
- 返回局部变量
int fun(){
int temp = 0;
return temp;
}
- 返回静态局部变量
int fun(){
static int temp = 0;
return temp;
}
静态变量存储在静态存储区中,从初始化后一直到程序结束,仅分配一次内存,函数返回后,变量不会被销毁。
- 返回静态的局部变量的地址
int *fun(){
static int temp = 1;
return &temp;
}
如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。
对于字符串的特殊情况: 由于常量字符串存储在常量存储区,所以函数返回一个指向常量字符串的指针是可以的,凡是返回一个局部字符串的指针是不可行的。
char* fun(){
char *p = "hello world!";
return p; //正确
}
char* fun(){
char str[] = "hello world!";
return str; //错误,解决办法是将字符串申明为static。
}
-
不能返回一般的自动数组名
当返回一个数组名时相当于返回指向这个数组的首地址的指针,当函数结束后就自动释放了这个指针,相当于返回了一个无效的指针。int* fun(){ int a[10]; return a; //错误 }
-
不能返回局部变量的地址
int* fun(){ int temp = 0; return &temp;//函数返回时把已销毁的变量的地址返回给调用者,结果会出错。 }
-
不能返回局部变量的引用
int& fun(){ int temp = 0; return temp;//引用返回的是局部变量temp本身而不是copy的一份,所以结果将不可预知。 }