关于函数返回值的一些理解
来源:互联网 发布:网络共享 win10 编辑:程序博客网 时间:2024/05/23 00:06
前面看了几篇关于函数返回值的帖子,觉得学多了高级程序语言,还是有必要对一些底层的只是需要了解一些
下面我总结了一些,肯定是不全,还望大家给予指正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;}
还有总结的不足之处欢迎大家批评指正,以此共同学习,共同进步
- 关于函数返回值的一些理解
- 关于函数返回值的一些见解
- 关于函数返回值的设计的一些思考
- 关于函数的返回值的一些困惑和解释
- 关于函数返回值作用域的一些思考
- 函数返回值的理解
- 关于 函数指针 的一些理解
- 关于函数柯里化的一些理解
- 关于欧拉函数的一些理解
- 关于JS函数的一些基本理解
- 关于gets函数和fgets函数的一些理解
- 关于C#间接继承的一些思考:如何修改继承函数的返回值类型
- 构造函数返回值的理解
- Socket一些函数相关的返回值
- Socket一些函数相关的返回值
- 关于函数指针的理解(指向的函数返回值又是另外一个函数指针)
- 关于对于C语言中主函数参数接返回值的理解
- 关于函数的返回
- linux ptrace函数
- 小明求素数积
- 徐氏银行开业了!!!!秒杀一切!!!!!
- 互联网产品“冷启动”问题浅析
- API Hooking (LoadLibrary)
- 关于函数返回值的一些理解
- ASP.NET 安全认证(三)—— 用Form 表单认证实现单点登录(Single Sign On)
- [Happy DSA] 将已排序的元素序列快速的插入到stl set中
- JM8.6中NALU(此处指VCL式的NALU)是如何写进码流的?
- Java:JComboBox 用法
- 【C++11】随机数函数库random
- Eclipse 自动生成 Ant的Build.xml 配置文件
- 安装SQL Server2008的示例数据库AdventureWorks 2008
- (转)LuaPlus C++ 函数互调