C语言自定义函数返回数组的方法(图文详解)

最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?

能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下:

直接返回str数组名(注意不需要加&,还有好多同学犯这个错)

但事实上,运行结果并非正常,我们尝试在调用函数中输出,可以看到结果并非是原来内容(当然你的电脑输出可能还不是这个样子)

如下:

原因大家可以从str的属性入手,str本身是一个自定义函数中的局部变量,是一个数组有一百个字节,它的生命周期当然也随着它所在的函数一起,正所谓“一招天子一朝臣”,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,理所当然的str数组这一百个字节也将被收回,所以”Hello www.dotcpp.com”这串字符串也就灰飞烟灭了!自然你在main函数里再输出肯定已经不是原来的内容了!

怎么样,可以理解吧!

不过,还没有结束,依然有同学继续问,可为什么我换成下面这种写法就可以了呢?

如下图:

答曰:这种写法情况下,str虽也属于是局部变量,但不是一个数组,而是一个指针,只有四个字节,存的是在常量区的字符串” Hello www.dotcpp.com”,但请注意,这个字符串在常量区,而不属于fun函数里的部分,全程序都可读,所以return之后依旧存在,返回的是str里的值,也就是字符串“Hello www.dotcpp.com”的首地址,是一个数,其实相当于把这个字符串的地址在str手里通过返回值转交到p里。

也可以打个比方:之前只有fun函数知道这个字符串,但现在已经马上不行了,临终前,交代:“我快不行了,赶紧把‘Hello www.dotcpp.com’的藏宝地址(字符串首地址)转交到main函数里!”

然后就return 快马加鞭的返回到main函数手里了!随后消失…

而后,main函数获得之后,你们也就知道了…

这样讲,大家能理解吗?

后期C语言逆向分析部分,也会有涉及到此处的原理,大家可以再深入学习理解。

同时,下篇我们将为大家讲解如何实现自定义函数的数组传递问题!

通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。

此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种:

1、直接使用全局变量:这种方法最方便,但此方法打破了函数间的通信及封装的思想,所以不推荐使用,不在今天讨论范围之内。

2、通过堆区动态开辟内存解决:C语言中,我们通常用malloc来在堆区动态开辟内存,利用堆区“现用现开辟,用完手动收回”特点,实现灵活管理。是实际开发中的常用办法,也是我们今天的主要内容。

3、由调用方传入数组指针:此种方法不需要函数返回地址,而是在调用时直接 传入数组地址,委托被调用方进行操作,由于此局部变量属于调用方本身,故即便被调用方结束内存释放,也不会被影响到该数组。

下面逐个实验,对于第二种方法,由于动态开辟内存在堆区,堆区不想上一讲中局部变量在栈区存储,系统根据它的生命周期自动收回,而是手动开辟,手动释放,这样就可以完全规避问题,例子与效果见下图:

需要注意的是:记得用完free掉,防止内存泄露!

第三种方法:虽然没有在函数中返回数组,但也可以解决数组通信问题,主要思路就是调用方中定义数组,然后将地址传入,由于该内存属于调用方,而非被调用方,故被调用方在调用结束后释放掉内存也无所谓。例子程序及效果如下:

关于数组使用传递的总结,大体如上,大家有任何问题和疑问还可以联系我们!

感谢大家的阅读,希望大家收益多多。

推荐教程:《C语言》

c语言中自定义函数返回数组,C语言自定义函数返回数组的方法(图文详解)相关推荐

  1. 空文件夹删不掉打不开,“该项目不存在请确认该项目位置“,“项目正在打开中无法删除“,“文件已损坏或者已经被移动删除“(多种方法图文详解,细节需要注意,以及可能遇到的问题)

    1.事前概要-触发这种文件夹的情况 这个删不掉的文件或文件夹其实是Windows系统的祖传bug到目前为止依然没有修复,所以说我们需要通过特别的手段来处理它,听我慢慢讲他的缘由可能会对解决这个问题的帮 ...

  2. c 语言中双向链表逆转编程题,C/C++ 双链表之逆序的实例详解

    C/C++ 双链表之逆序的实例详解 一.结点结构 双向链表的数据结构定义如下: typedef struct node { ElemType data; struct node *prior stru ...

  3. c++语言关键字大全,C++语言const 关键字使用方法图文详解

    之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点.知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自 ...

  4. 307. Range Sum Query - Mutable | 307. 区域和检索 - 数组可修改(数据结构:线段树,图文详解)

    题目 https://leetcode.com/problems/range-sum-query-mutable/ 吐槽官方题解 这题的 英文版官方题解,配图和代码不一致,而且描述不清:力扣国内版题解 ...

  5. python3.7 的pygame安装方法_Python中pygame安装方法图文详解

    本文实例讲述了Python中pygame安装方法.分享给大家供大家参考,具体如下: 这里主要描述一下我们怎样来安装pygame 可能很多人像我一样,发现了pygame是个好东东,但是就是不知道怎样使用 ...

  6. python之pygame安装教程_Python中pygame安装方法图文详解

    搜索热词 本文实例讲述了Python中pygame安装方法.分享给大家供大家参考,具体如下: 这里主要描述一下我们怎样来安装pygame 可能很多人像我一样,发现了pygame是个好东东,但是就是不知 ...

  7. hp打印机一直显示正在打印中_惠普打印机哪个型号好 安装hp打印机驱动方法【详解】...

    一般我们在日常的 办公室 和居室中,基本上都会使用到打印机和复印机这样普遍的办公产品,不过市面上的打印机品牌有很多,比较常见的打印机品牌应该就是爱普生和惠普打印机了,不过惠普打印机从刚开始到现在,已经 ...

  8. 荣耀畅玩7C设置语言步骤,荣耀畅玩7C怎么截图?华为荣耀畅玩7C手机截屏方法图文详解...

    3月12日下午,荣耀正式发布了旗下第二款全面屏手机---荣耀畅玩7C,该机主打全面屏和双摄,售价899元起,具有不错的性价比表现,该机已在线上和线下全面发售了,相信大家在使用过程当中难免会进行各种截屏 ...

  9. c语言 多线程 传话,code vs1506传话(塔尖)+tarjan图文详解

    1506 传话 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 一个朋友网络,如果a认识b,那么如果a第一次收到某个消息,那么会 ...

最新文章

  1. /etc/rsyncd.conf
  2. 11/28 前端码农日报
  3. iOS之深入解析Runtime的Method-Swizzling方法交换的妙用和底层原理
  4. knockout + easyui = koeasyui
  5. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...
  6. 关于File.separator 文件路径:window与linux下路径问题(“No such file or diretory ”异常解决方案)...
  7. NTFS系统的访问控制上的权限条目
  8. 2017全球光伏增速或放缓 国内“6·30”仍将是分水岭
  9. IPv6中NDP协议简介
  10. Python 序列化模块(json,pickle,shelve)
  11. 使用SCVMM2008 R2管理Hyper-V之3-使用模板部署虚拟机
  12. mac 启用root用户
  13. linux 手机遥控器,哪一个最适用?五款常用手机万能遥控器对比体验
  14. python 模型 欺诈概率_手把手教你使用Python实战反欺诈模型|原理+代码
  15. 2021年中国国内生产总值(GDP)、GDP结构及人均国内生产总值分析[图]
  16. percentile函数mysql_SQL使用窗口函数计算百分位数
  17. 我在飞机上,飞机在哪里?浅谈飞行模式与GPS定位
  18. 【mmDetection框架解读】入门篇一、各组件解读,配置文件解读
  19. 无法找到c语言dll入口点,c# – 无法在DLL中找到入口点
  20. linux关闭笔记本自带键盘

热门文章

  1. JS parseInt的用法
  2. 算法第五期——贪心法(Python)
  3. Tessy软件下载安装使用试用购买
  4. 【记录】Android关于WebView内容转PDF文件打印及其遇到的问题解决方案
  5. 1052 Linked List Sorting (25分)
  6. 组织及其IT部门的职责划分
  7. 沁恒CH579M使用PWM+DMA驱动WS2812B程序
  8. python装饰器使用_Python装饰器使用技巧
  9. 约瑟夫环--C语言解析
  10. 年货都买些什么?年货清单列表用便签记下来