免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: googny
打印 上一主题 下一主题

关于返回函数局部变量的问题(c 语言) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-04-27 11:14 |只看该作者
“当把函数局部变量作为返回值的时候,这是一个典型的错误”——这是错的。
估计LZ说的是返回指向的局部非静态变量的指针的情况。
其实这个指针如果不进行间接操作,也没什么问题。如果*了,超过生存期访问对象,UB。



论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2012-04-27 11:16 |只看该作者
C返回值是个值,这个值究竟是啥,是啥类型,能不能用,是程序员要思考的问题

比如函数返回值是0x0000000000000000
你把这个值当成整数,那就是0
你把这个值当成指针,那就是NULL
你把它当成字符串内容,他就是个8个'\0'

函数的返回值仅仅是个值,关键在于你怎么解释这个值,这个已经脱离函数本身的控制了
返回函数内局部指针甚至是free掉的内存首地址都是合法的返回值,只不过用起来不合法罢了

评分

参与人数 1可用积分 +10 收起 理由
samon_fu + 10 这就是C。站的够高,赞一下。

查看全部评分

论坛徽章:
0
13 [报告]
发表于 2012-04-27 14:05 |只看该作者
回复 11# 幻の上帝
没太看懂,这个代码有问题么?
不能返回局部变量地址,能举个例子说明一下么?

   

论坛徽章:
0
14 [报告]
发表于 2012-04-27 14:09 |只看该作者
回复 12# safedead

如果函数的返回类型需要是一个指针类型,是不是就需要定义一个全局的静态变量?怎样是正确合法的呢?

论坛徽章:
0
15 [报告]
发表于 2012-04-27 14:13 |只看该作者
zehn_w 发表于 2012-04-27 14:09
回复 12# safedead

如果函数的返回类型需要是一个指针类型,是不是就需要定义一个全局的静态变量?怎样 ...


例如:
void getmem(char **str)

这种参数就可以了

论坛徽章:
0
16 [报告]
发表于 2012-04-27 14:31 |只看该作者
回复 15# enough_zerg

这个好像有点偏离我的意思。
不过我想明白了,完整地说是这是一个错误的用法。纠结错误两个字了...
   

论坛徽章:
0
17 [报告]
发表于 2012-04-28 01:58 |只看该作者
本帖最后由 幻の上帝 于 2012-04-28 02:02 编辑

回复 13# zehn_w
比如说你的这段:

  1. char * combine(char *str1,char *str2)
  2. {
  3. char str[1024];
  4. char *p=str;

  5. strcpy(str,str1);
  6. strcat(str,str2);
  7. return p;
  8. }
复制代码
p初始化为&str[0],指向str的元素,之后没有改变,它的值被返回。由于str并非静态对象,返回以后生存期就结束了,这时若有q = combine(str1, str2),则这个q指向的不是一个处于生存期中的有效的对象。如果只是对这个值本身进行操作,例如printf("%d",(int)q);,这没什么问题;但如果是*q、q[1]这样依赖于q指向的对象的操作就是错误的。

论坛徽章:
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
18 [报告]
发表于 2012-04-29 21:28 |只看该作者
回复 2# MMMIX

也不代表结果正确。

   

论坛徽章:
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
19 [报告]
发表于 2012-04-29 21:28 |只看该作者
回复 14# zehn_w

关键是返回的地址还有意义。
   

论坛徽章:
0
20 [报告]
发表于 2013-01-11 09:45 |只看该作者
11楼最后两句话精辟,楼主体会下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP