免费注册 查看新帖 |

Chinaunix

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

[C] 下面的代码运行后输出结果为什么都是one one [复制链接]

论坛徽章:
5
双鱼座
日期:2013-11-26 17:56:26狮子座
日期:2013-11-29 15:41:32处女座
日期:2014-02-21 11:59:07技术图书徽章
日期:2014-03-06 15:33:53技术图书徽章
日期:2014-03-06 15:39:30
11 [报告]
发表于 2013-10-29 12:51 |只看该作者
回复 9# myworkstation


    嗯。。让我想想。。我觉得是这样的。。如果一个函数类似这样


  1. struct g { char a[6]; };//声明没定义。
  2. struct g ff(void) {
  3.   struct g r= { "test" };
  4.   return r;
  5. }
  6. int main()
  7. {
  8. printf ("%s", ff().a);
  9. return 0;
  10. }
复制代码
在这段代码当中,g是一个局部变量,存在一个address当中,在返回的时候,函数仅仅传回g这个struct的指针,在调用printf之前这段时间里,程序不能保证g这块空间有没有被释放掉,这种情况下是未定义的,而现在lz的程序是g前面等于加上了一个static,等于那些值有了固定的地点存放,不会被释放,所以这种情况不是未定义的。

相当于。


  1. struct g { char a[6]; };//声明没定义。
  2. struct g ff(void) {
  3.   struct g r= { "test" };
  4.   return r;
  5. }
  6. int main()
  7. {
  8. struct g r = ff();//有了固定的存放点。
  9. printf ("%s", r.a);
  10. return 0;
  11. }
复制代码

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
12 [报告]
发表于 2013-10-29 13:50 |只看该作者
回复 11# bottles


    有那么点意思,但你的例子其实不贴切。
  1. struct g { char a[6]; } ga;
  2. struct g ff(void) {
  3.   ga = { "test" };
  4.   return ga;
  5. }
  6. int main()
  7. {
  8. #下面的代码只能表示按照默认调用约从右向左传递参数(入栈),但是哪个ff()先进行计算却是没有规定的。
  9. printf ("%s", ff().a,ff().a);
  10. return 0;
  11. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP