免费注册 查看新帖 |

Chinaunix

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

printf为什么会这样? [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-27 12:28 |只看该作者 |倒序浏览
看看这个程序的执行结果:
  1. char *Func(int n)
  2. {
  3.     static char s[20];

  4.     sprintf(s, "number %d", n);

  5.     return s;
  6. }

  7. main()
  8. {
  9.     printf("%s, %s\n", Func(1), Func(2));
  10. }
复制代码

为什么是number 1, number 1?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-27 12:40 |只看该作者

printf为什么会这样?

因为两个func的执行顺序不一定,取决于编译器。
你的程序,在你的编译器上,相当于:
func(2);
func(1);
printf……

你说是不是两个1呢?

尽量不要在printf参数中调用函数或进行任何运算。

论坛徽章:
0
3 [报告]
发表于 2004-12-27 12:56 |只看该作者

printf为什么会这样?

问题在于: static char s[20];

论坛徽章:
0
4 [报告]
发表于 2004-12-27 12:58 |只看该作者

printf为什么会这样?

应该是: static char s[20];
和printf的原因,真正的输出是在见到;的时候

论坛徽章:
0
5 [报告]
发表于 2004-12-27 13:08 |只看该作者

printf为什么会这样?

c程序的参数都是从最右面一个开始入站的。和编译无关。可以改变次序,比如加PASCAL等函数说明--这和编译有关。
是static char S[]的问题。如果用MALLOC就可以了

论坛徽章:
0
6 [报告]
发表于 2004-12-27 13:17 |只看该作者

printf为什么会这样?

malloc也不可以,传递一个局部变量的指针是很危险的.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-12-27 13:23 |只看该作者

printf为什么会这样?

定义成全局char s[20]也是一样的
一个static的局部变量return出去没什么问题吧?
  1. int Func(int n)
  2. {
  3.     return n+1;
  4. }

  5. main()
  6. {
  7.     printf("%d, %d\n", Func(1), Func(2));
  8. }

复制代码
这个为什么就是 2, 3?
和地址有关。

论坛徽章:
0
8 [报告]
发表于 2004-12-27 13:27 |只看该作者

printf为什么会这样?



  1. #include <stdio.h>;

  2. char *ma[4];
  3. int  mn = 0;

  4. char *Func(int n)
  5. {
  6. char *s = malloc(32);
  7.     ma[mn++] = s;
  8.     sprintf(s, "number %d", n);

  9.     return s;
  10. }

  11. main()
  12. {
  13. int i;

  14.     printf("%s, %s\n", Func(1), Func(2));

  15.     for(i = 0; i < mn; i++)
  16.       if(ma[i]) free(ma[i]);
  17.   
  18. }
复制代码

就可以了。
最后的free其实是多此一举的。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-12-27 13:30 |只看该作者

printf为什么会这样?

大家都木有认真看偶的解释啊。

1、参数中的函数的计算顺序,标准没有规定,由编译器来决定。所以建议不要使用这种方式。
2、yuxh的第二个例子和第一个例子一点都不冲突。你的编译器是从左到右计算参数的。

论坛徽章:
0
10 [报告]
发表于 2004-12-27 13:30 |只看该作者

printf为什么会这样?


  1. char *Func(int n)
  2. {
  3.     static char s[20];

  4.     sprintf(s, "number %d", n);

  5.     return s;
  6. }

  7. main()
  8. {
  9.     printf("%s, %s\n", Func(1), Func(2));
  10. }

复制代码

应该是和压参数的顺序有关的,先压的是2的,然后压的是1的,而在调用printf的时候用了最后的那个1的所以。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP