关于函数返回值的一些理解

2 篇文章 0 订阅
1 篇文章 0 订阅

前面看了几篇关于函数返回值的帖子,觉得学多了高级程序语言,还是有必要对一些底层的只是需要了解一些

下面我总结了一些,肯定是不全,还望大家给予指正O(∩_∩)O~

当我们使用一个被调函数的时候,return的时候分为两个情况,一个是返回数值,一个就是指针(或者引用)

当我们返回数值的时候,编译通过,没有问题,输出结果也没有问题,如下代码是通过测试的

#include <stdio.h>
int sum(int a,int b)
{
    int s;
    s=a+b;
    return s;
}
int main(void)
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",sum(a,b));
    return 0;
}

解析:主调函数(也就是main函数)调用sum函数的时候,sum函数的局部变量s就是两个实参的副本的和,是存放在栈里面的,此时会进行一个压栈的操作

当调用函数结束的时候,也就是return了,此时局部变量就会随着函数的结束被销毁,但是销毁的是s,数值会通过副本传回主函数,也就是进行了一个出栈的操作

其实实质也就是传回了该值的一个副本,也就是两个数的和,这是一个实实在在的数字

所以运行结果是ok的


但是如果当我们想要返回一个指针的时候,就会出现问题的

比如以下的代码

#include <stdio.h>
char*GetMemory(void)
{
    char p[]="hello world";
    return p;
}
int main(void)
{
    char *str=NULL;
    str=GetMemory();
    printf(str);
    return 0;
}
解析:之前在别的地方看到一个很形象的解释,就是你去旅游,觉得当地的一家酒店的饭菜很有特色,于是就记下了它的地址门牌号之类的(相当于指针),当你回去之后,也就是函数调用完毕,返回这个指针是没有问题的,你回去之后是依然可以看这个地址门牌号的,但是当一段时间再去上次旅游的地方,可能那家酒店已经不存在了,可能变成了一家理发店或者其他什么的

所以,当函数调用结束,指针所指向的内容是存放在栈的,会随着函数一起销毁的,但是指针还是存在的,只不过此时指针指向的内容不确定,所以结果是会出错的(跟上面传值回来是一回事,传递一个指针的副本回主调函数,但是该指针是指向被调函数的局部变量,该局部变量是已经随着被调函数已经销毁掉的,所以这时指指针的指向是不确定的,至少是未知的,所以容易出现错误)



但是通过其他方法我们可以避免对指针返回的错误

比如延长指针的生命期,将其设置为静态变量,使其生命期延长至整个文件

或者设置成一个字符串的常量,让其存放在静态区中也是可以的

实现的代码如下

#include <stdio.h>
char *GetMemory(void)
{
	static char p[]="hello world";
	return p;
}
int main(void)
{
	printf("%s\n",GetMemory());
	return 0;
}


#include <stdio.h>
char *GetMemory(void)
{
    char *p="hello world";
	return p;
}
int main(void)
{
	printf("%s\n",GetMemory());
	return 0;
}




还有总结的不足之处欢迎大家批评指正,以此共同学习,共同进步

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值