C语言总结之函数的返回值

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

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

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

 

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

#include <stdio.h>
#include <stdlib.h>
int add_rtVal(int a,int b)
{
    int c = 0;
    c = a + b;
    return c;
}
int main(int argc,char* argv[])
{
    int a = 0,b = 0;
    int c = 0;
    a = 3;
    b = 5;
    c = add_rtVal(a,b);
    printf("c=%d/n",c);
    
    return 1;
}

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

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

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

#include <stdio.h>
#include <stdlib.h>
char* hello()
{
    char p[]= "hello world";
    return p;
}
int main(int argc,char argv[])
{
    char *str;
    
    str = hello();
    printf("%s/n",str);
    return 1;
}

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

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

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

总结一句话:要时刻清楚你使用的指针指向哪里。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值