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

时间:2022-08-20 18:51:11

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

下面我总结了一些,肯定是不全,还望大家给予指正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;
}




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