免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-27 09:22 |只看该作者 |倒序浏览
本帖最后由 googny 于 2012-04-27 11:25 编辑

函数里面定义的变量是局部变量,当把函数局部指针变量作为返回值的时候,这是一个典型的错误;  (多谢大家的批评建议,我已经更正了)
但是小编在试验的时候,发现当要返回的局部变量是指针的时候,运行结果正常,所以小编在此贴出代码,向大家求教
linux下编译运行 win下暂时还没尝试。
  1. 1 #include<stdio.h>
  2.   2 #include<string.h>
  3.   3
  4.   4 char * combine(char *str1,char *str2)
  5.   5 {
  6.   6     char str[1024];
  7.   7     char *p=str;
  8.   8
  9.   9     strcpy(str,str1);
  10. 10     strcat(str,str2);
  11. 11
  12. 12     return p;
  13. 13 }
  14. 14
  15. 15 int main()
  16. 16 {
  17. 17     char *q;
  18. 18
  19. 19     q= combine("hello","world");
  20. 20     //char *p=combine("hello","world");
  21. 21     printf("%s\n",q);
  22. 22     printf("%s\n",p);
  23. 23     return 0;
  24. 24     }
复制代码
问题在19行,  当输出q[],的时候,能正确显示。 小编觉得可能是我运行的程序太少,于是就添加了20行,但是结果还是显示正确。
百撕不得骑姐,于是就贴出来,供大家把玩。

论坛徽章:
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
2 [报告]
发表于 2012-04-27 09:25 |只看该作者
回复 1# googny


    编译正常,运行正常,并不代表你的代码就是正确的。没错,这就是 C。

论坛徽章:
0
3 [报告]
发表于 2012-04-27 09:26 |只看该作者
擦 。 我错了 各位大人   我19,20行用的字符串一样,当我把20行字符串换成char *p=combine("be","happy");之后,运行结果就全部变成 be happy了  
说明局部变量返回时指针原来指向的内容已经木有了。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2012-04-27 09:38 |只看该作者
楼主的代码为什么要加上行号?

论坛徽章:
0
5 [报告]
发表于 2012-04-27 09:43 |只看该作者
本帖最后由 frank529 于 2012-04-27 09:44 编辑

回复 1# googny


    返回p的是栈内存的地址,栈是用来给进程做函数调用,存放局部变量的地方,它是内存,所以你可以通过地址读写。但它由编译器翻译的汇编代码控制,函数返回后退栈,栈顶指针低于你p所指向的内存值,所以此时p还保留着上次操作的值。但是如果又发生函数调用或声明了局部变量,栈顶指针会盖掉p所指向的内存,则此时内存值就不再是你预期的值了

论坛徽章:
0
6 [报告]
发表于 2012-04-27 09:47 |只看该作者
回复 3# googny


    当把函数局部变量作为返回值的时候,这是一个典型的错误;
LZ这句话就有问题,返回局部变量的值是很正常的,返回局部变量的地址就有问题了

论坛徽章:
0
7 [报告]
发表于 2012-04-27 09:58 |只看该作者
回复 1# googny
你拉了一堆屎在那里,然后,你人挂了,清洁工暂时还没把那陀屎清扫掉,别人路过的时候还是会踩到


还有就是 只是不能返回局部变量地址,返回变量值是可以的,请不要胡说

   

论坛徽章:
0
8
发表于 2012-04-27 10:52
呵呵  好吧 我错了 码错字了  各位好牛阿  返回局部变量值是可以的。 回复 7# enough_zerg


   

论坛徽章:
0
9 [报告]
发表于 2012-04-27 10:53 |只看该作者
回复 6# xxw19840406
呵呵  好吧 我错了  各位好牛阿  返回局部变量值是可以的。   


   

论坛徽章:
0
10 [报告]
发表于 2012-04-27 10:54 |只看该作者
回复 4# bruceteen
在vi下直接复制的  加上行号了 下回注意。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP