一个被忽略的问题
今天突然想到一个以前被忽略的问题:
临时变量(指针或值)能不能做为返回值??
按照概念:一个函数的临时变量是放在栈中的,在函数执行完栈空间将被系统
回收,那么就是不可以做为返回值了(因为被回收后值就不存在了)。可是在
应用中好象又可以,如例:
#include <stdio.h>
#include <string.h>
char fun1()
{
char f1;
f1 = 'a ';
return f1;
}
char *fun2()
{
char f2[10];
sprintf(f2, "%s ", "qwer ");
return f2;
}
int main()
{
char *ts;
printf( "%c\n ",fun1());
printf( "%s\n ", fun2());
return 0;
}
两个函数都是返回的局部变量,fun1()可以,fun2()不可以,为什么??
[解决办法]
fun1是返回一个值,fun2是返回一个指向数组的指针,
return f1或则return f2.返回时,首先现把f1或则f2,先把这个值拷贝到一个临时空间,
接着把函数空间释放掉.
printf( "%c\n ",fun1());//retrun f1本身返回的一个值,把值放到这个临时空间,在此从临时空间取出.
printf( "%s\n ",fun2());//retrun f2本身返回的一个地址,从此地址指向的空间取值,但此空间已经释放掉了.
[解决办法]
这两个例子最大的不同就是,前者按值返回,后者按地址返回
所以有一句话叫:不要返回局部变量的指针(或引用),而按值返回是没问题的.