c语言函数返回值问题


返回局部变量 、局部指针、 局部数组
这三种情况,

 

返回局部变量,其实是拷贝的副本,所以没问题。
返回局部指针,指针指向的内容会随函数失效,所以不妥。

 

考虑返回局部变量和局部变量指针

return语句
调用函数的时候,会在调用函数的地方生成一个临时变量,return语句将你要的返回值赋给这个临时变量,也就是临时变量得到返回值的一个副本

其实很简单,如果指针指向的是一段栈区(局部变量就放在这里啦),函数结束后返回,这段栈被释放了,你能通过return得到指针的副本,但是这是指针指向的空间已经无效啦,你让指针咋办呢?

对比局部变量,返回它,就是让上面说的临时变量得到它的一个副本.

 

____

 

 

局部变量里面还得分为自动还是静态,两者结果是不同的,得分开描述。

数组是不能作为函数的返回值的,原因是数组名是一个不可修改的左值,例如这样的代码是非法的:

int func( void )[5];

返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。例如:

int* func( void )
{
    static int a[10];
    ........
    return a;
}

局部变量也分局部自动变量和局部静态变量,由于c返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。例如:

int func()
{
      int a;
      ....
      return a;    //允许
}                   

int * func()
{
      int a;
      ....
      return &a;    //无意义,不应该这样做
}

局部指针跟上面所述的局部变量一样。可以返回一个局部指针的值,也可以返回一个局部静态指针的地址,但不应该返回一个局部自动指针的地址。

 

-----------------------------------------

补充:

1.     上次写个程序遇到一个函数指针传递,搞了我好长时间,后来还是我堂弟帮我解决难题,呵呵,这里写出来让大家以后不要犯我这样的错误,也是C语言的基础:

    

    先看段代码(一):

      

 

   为什么是out的值是null呢? 再看一段代码(二):

   

 

   在这里说解释一下原因:

        代码一当中wchar_t *out;是定义一个指针,但还没有分配内存指向,传递给charToWchar只不过是一个指针copy,但没有具体的地址,虽然在charToWchar里面分配了内存(有了指向),但这个out指针不是外面的out,因为传递的时候是copy的;

 

        代码二当中 out在外面就分配了内存,有具体地址;虽然传递给charToWchar也是指针copy,但charToWchar当中的out和外面的out地址是一个,所以能传出来;

 

2.还看一个段代码(三):

这里的aj有具体的地址赋给test函数j,所以test函数里面的j的值是aj的地址。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值