C语言函数的返回值

关于这个问题,大家应该在很多书上看到过:

1.函数的返回值不可以是局部变量;

2.函数内的局部变量在函数调用完成之后自动销毁,因为局部变量是存放于栈空间内的;

 

 理论很明确,但是实际应用中还是有一些疑惑的。先找几个常见的例子一步一步深入说明。

[cpp]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int add_rtVal(int a,int b)  
  4. {  
  5.     int c = 0;  
  6.     c = a + b;  
  7.     return c;  
  8. }  
  9. int main(int argc,char* argv[])  
  10. {  
  11.     int a = 0,b = 0;  
  12.     int c = 0;  
  13.     a = 3;  
  14.     b = 5;  
  15.     c = add_rtVal(a,b);  
  16.     printf("c=%d/n",c);  
  17.       
  18.     return 1;  
  19. }  

这个运行结果是什么? 按照上面的理论,我们返回一个局部变量,这个局部变量在函数调用完成后已被自动销毁,那返回值应该是乱值才对。但实际上运行结果是正确的。为什么?

      这个地方我曾经也很迷惑。因为有一个概念不清楚,所有不明白这什么这样可以。我们返回的是一个值 ,在返回值后我们将其赋给了变量C,相当于创建了一个副本,不论add()中的局部变量是否销毁都没有关系了。

      但是如果我们返回的是一个地址,指向局部变量的地址,就不行了。因为局部变量的地址在函数调用完成后销毁,我们返回的地址就指向的区域内就不是我们想要的值了,因为这块区域已是公共的,可被其它函数占用的,其内容是不定的。看如下例子:

[cpp]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. char* hello()  
  4. {  
  5.     char p[]= "hello world";  
  6.     return p;  
  7. }  
  8. int main(int argc,char argv[])  
  9. {  
  10.     char *str;  
  11.       
  12.     str = hello();  
  13.     printf("%s/n",str);  
  14.     return 1;  
  15. }  

在我的电脑上,编译时会提示warning message:

hello.c: In function ‘hello’:
hello.c:25: warning: function returns address of local variable

运行结果当然是一堆乱码了。

总结一句话:要时刻清楚你使用的指针指向哪里。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值