C语言自定义函数如何返回数组

C语言自定义函数如何返回数组C语言自定义函数如何返回数组 C语言研究中心 CTO  9个月前(01-28)  4759次浏览  5个评论最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?能否直接在自定义函数中,写成char*类型返回值,直接返回呢?,代码如下:   直接返回str数组名(注意不需要加&,还有好多同学犯这个错)但事实上,运行结果并非正常,我们尝试在

大家好,又见面了,我是你们的朋友全栈君。

C语言自定义函数如何返回数组

 C语言研究中心
 CTO 
 9个月前 (01-28) 
 4759次浏览 
 5个评论

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

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

 

C语言自定义函数如何返回数组(上)?

 

 

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

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

如下:

 

 

C语言自定义函数如何返回数组(上)?

 

 

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

 

怎么样,可以理解吧!

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

如下图:

 

 

C语言自定义函数如何返回数组(上)?

 

 

 

答曰:这种写法情况下,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语言研究中心(www.dotcpp.com)



C语言网, 版权所有丨如未注明 , 均为原创丨本网站采用
BY-NC-SA协议进行授权 , 转载请注明
C语言自定义函数如何返回数组(上)?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149214.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux复制文件到当前目录并重命名_Linux复制文件到当前文件夹

    linux复制文件到当前目录并重命名_Linux复制文件到当前文件夹./表示当前目录cptest/*.wav./-r递归子目录cp-r绝对路径/文件目标路径cp-r绝对路径/*.wav目标路径copy一个目录下的所有文件以及递归文件到当前文件夹cp-raudios/*./

    2022年8月23日
    5
  • java interface接口和多继承[通俗易懂]

    java interface接口和多继承[通俗易懂]很长时间不能很好解释多继承,今天看到一个特别好的解释,大快! 以下是引用:我认为你好像是不明白接口怎么用?也就是不明白为什么要定义那么多接口然后再用类去一个个继承他们。我跟你举个游戏的例子吧:这里有一个游戏,人猿泰山。主角是一个单独的类,这里我们主要用怪物说明接口的用法:怪物有很多种,按地域分:有的在天上飞,有的在地上跑,有的在水里游按攻击方式分:有的能近距离物理攻击,有的能

    2022年7月16日
    14
  • 优麒麟 2204 安装 Fcitx5 输入法

    优麒麟 2204 安装 Fcitx5 输入法Fcitx5是继Fcitx之后的新一代输入法框架,优麒麟2204默认安装的是Fcitx,而Fcitx和Fcitx5是相互冲突的,因此安装Fcitx5之前需要先卸载Fcitx。

    2022年7月14日
    22
  • 关于HeartBleed漏洞的总结「建议收藏」

    关于HeartBleed漏洞的总结「建议收藏」一:前言HeartBleed漏洞又称为心脏出血漏洞,编号(CVE-2014-0160),产生原因:由于未能在memcpy()调用受害用户输入的内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSl所分配的64KB内存,将超出必要范围的字节信息复制到缓存当中,再返回缓存内容,这样一来,受害者的内存内容就会每次泄露64KB.简单来说,这就是OpenSSL缺陷造成的漏洞二:环境…

    2022年7月25日
    12
  • 【报告分享】2021抖音数据报告-巨量算数(附下载)

    【报告分享】2021抖音数据报告-巨量算数(附下载)摘要:报告统计了2021年抖音获赞最多的十大职业,分别是:教师、医生、农民、消防员、交警、教练、外卖员、环卫工人、记者、家政服务员。其中,教师获赞72.9亿次。记录和分享生活,已经成为人们的习惯。报告还披露了人们记录生活的无数种切面。2021年记录了1783万次离别,但也记录了2854万次团圆;有1134万条视频关于放弃,但关于坚持的视频则超过5055万条。来源:巨量算数​如需查看完整报告和报告下载或了解更多,公众号:行业报告智库今日报告分..

    2022年5月8日
    274
  • 磁盘未初始化 修复_初始化磁盘是什么意思

    磁盘未初始化 修复_初始化磁盘是什么意思磁盘没有初始化是因为0号扇区损坏,导致机械硬盘分区表读取不出来,从而机械硬盘出现磁盘没有初始化。工具/软件:极限数据恢复软件步骤1:程序打开后,直接双击需要恢复数据的物理盘。步骤2:等待程序扫描完毕大概需要几分钟到半个小时,稍微耐心等下即可。步骤3:软件扫描到资料后,软件会将扫描到的分区列出来。步骤4:勾上所有需要恢复的资料,右击选择《复制勾选的文件》,…

    2022年4月19日
    129

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号