• 欢迎访问C语言网www.dotcpp.com 比赛栏每月有奖月赛!举办比赛联系QQ:2045302297
  • 问题反馈、粉丝交流 QQ群327452739 蓝桥杯训练群:113766799 申请群时请备注排名里的昵称
  • C语言研究中心 为您提供有图、有料、解渴的C语言专题! 欢迎讨论!

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

C语言研究中心 CTO 43411次浏览 9个评论

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

能否直接在自定义 函数中,写成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语言逆向分析部分,也会有涉及到此处的原理,大家可以再深入学习理解。

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

 

哦,忘记祝大家2017新春快乐! 祝身体健康、鸡年吉祥!

 

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

C语言网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言自定义函数如何返回数组(上)?
喜欢 (180)
[jinyangH@aliyun.com]
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
(9)个小伙伴在吐槽
  1. 所有定义的数组都存储在栈区吗?
    Nrdesire2017-01-29 09:51 回复
    • 局部变量是的,比如咱们例子当中的数组
      CTO2017-01-29 15:13 回复
  2. 好形象!!!
    老司机2017-02-01 22:11 回复
    • 多谢多谢! :mrgreen:
      CTO2017-02-02 17:00 回复
  3. 要不要那么幽默,我被感动到了。哈哈! :mrgreen:
    宸宸2017-05-15 14:50 回复
  4. 小哥,我就喜欢你这种中央空调型的教程写手,自己提出问题,自己解答,把自己学到的经验都分享出来,我为什么对你这么不吝赞词呢,因为我也是这样的写手,哈哈哈
    马家沟畔的黄先森2018-01-19 09:39 回复
  5. 没想到吧,哈哈,都快到2022年,还有人依然来这里
    康康2021-12-22 17:35 回复
    • 已经2022,马上2023啦
      lemon2022-10-04 18:21 回复
  6. 太厉害了这个比看书好理解多了
    王好的2023-10-27 00:25 回复