免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5680 | 回复: 11
打印 上一主题 下一主题

函数返回局部变量的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-06 18:36 |只看该作者 |倒序浏览
《C专家编程》里面的
  1. char * licalized_time()
  2. {
  3.     char buffer[120];
  4.     ......
  5.     return buffer;
  6. }
复制代码
这里有可能出错。
但是经常在很多函数里面有返回局部int变量的,好像都没有问题
  1. int func()
  2. {
  3.     int ret;
  4.     ......
  5.     return ret;
  6. }
复制代码
只是前面返回的是局部的char[],后面的返回的是局部的int
为什么前面的不能,后面的能呢

论坛徽章:
0
2 [报告]
发表于 2011-11-06 21:40 |只看该作者
这里的函数返回值有个根本的区别,你的问题很好啊,问问题的同时也道出了答案:
情况1:
  1. char * licalized_time()
  2. {
  3.     char buffer[120];
  4.     ......
  5.     return buffer; // 返回的是一个指针,并且是一个临时内存的指针,一旦函数退出该指针指向的内存就无效了
  6. }
复制代码
情况2:
  1. int func()
  2. {
  3.     int ret;
  4.     ......
  5.     return ret; // 这里返回的是一个int数值,也就是这里是数值返回,注意其和返回变量的区别哦
  6. }
复制代码
其实说白了,这个问题是一个指针、引用、数值作为形参或者函数返回值的问题。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
3 [报告]
发表于 2011-11-06 22:18 |只看该作者
返回去一个已经不存在的数组的内存地址干什么呢?

论坛徽章:
0
4 [报告]
发表于 2011-11-06 22:25 |只看该作者
返回值实际上存在一个复制。。。

返回整形的时候,复制的是那个整形。

你返回指针的时候,复制的是那个指针,但是指针指向的地址在函数的堆栈上,函数执行完后,那块内存已经无效了。

传递参数也一样,实际上,任何语言,不管是C/C++/JAVA/C#,传参数或者返回值,都是按照值传递的,都是复制一份原来的变量。

也不知道哪个**创造了按值传递和按引用(指针)传递这两种说法。这个世界上就不存在按引用传递这回事。

论坛徽章:
0
5 [报告]
发表于 2011-11-06 22:26 |只看该作者
返回值实际上存在一个复制。。。

返回整形的时候,复制的是那个整形。

你返回指针的时候,复制的是那个指针,但是指针指向的地址在函数的堆栈上,函数执行完后,那块内存已经无效了。

传递参数也一样,实际上,任何语言,不管是C/C++/JAVA/C#,传参数或者返回值,都是按照值传递的,都是复制一份原来的变量。

也不知道哪个傻B创造了按值传递和按引用(指针)传递这两种说法。这个世界上就不存在按引用传递这回事。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2011-11-06 22:29 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2011-11-06 22:48 |只看该作者
这个世界上就不存在按引用传递这回事。
unistd 发表于 2011-11-06 22:25



    因為引用本身也是一個值

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2011-11-06 23:07 |只看该作者
回复 1# zhongyj


    這還是區分不開「對象(object)」和「對象的地址(address of a object)」

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2011-11-06 23:19 |只看该作者
也不知道哪个傻B创造了按值传递和按引用(指针)传递这两种说法。这个世界上就不存在按引用传递这回事。
unistd 发表于 2011-11-06 22:26



    存不存在,端看你如何界定被傳的參數了。另外,把邏輯語義和某些實現混在一块不加區分也是造成這種思維混亂的原因,了解些程序語言的設計原理或是其它一些編程語言對理清這種混亂是很有幫助的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2011-11-06 23:36 |只看该作者
传递参数也一样,实际上,任何语言,不管是C/C++/JAVA/C#,传参数或者返回值,都是按照值传递的,都是复制一份原来的变量。
unistd 发表于 2011-11-06 22:26



    這還是區分不開「語義」和「實現」。「按值傳遞」、「按引用傳遞」等等都是語義,具體怎麼實現(通過棧/寄存器傳參,傳遞指針,等等)這些語義,則應歸於實現部分。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP