首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个被忽略的有关问题

2012-03-23 
一个被忽略的问题今天突然想到一个以前被忽略的问题:临时变量(指针或值)能不能做为返回值??按照概念:一个

一个被忽略的问题
今天突然想到一个以前被忽略的问题:
临时变量(指针或值)能不能做为返回值??
按照概念:一个函数的临时变量是放在栈中的,在函数执行完栈空间将被系统
回收,那么就是不可以做为返回值了(因为被回收后值就不存在了)。可是在
应用中好象又可以,如例:
#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本身返回的一个地址,从此地址指向的空间取值,但此空间已经释放掉了.
[解决办法]
这两个例子最大的不同就是,前者按值返回,后者按地址返回

所以有一句话叫:不要返回局部变量的指针(或引用),而按值返回是没问题的.

热点排行