免费注册 查看新帖 |

Chinaunix

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

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

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

printf为什么会这样?

原帖由 "aero" 发表:
我是说的参数计算顺序,又没说入栈顺序。yuxh的例子,明显是从左到右计算的参数。

话又说回来,的确一般的compiler都是从右至左入栈,但这个是标准规定的吗?我不清楚。

参数计算应该和入栈顺序一致。
这里入栈的两个指针是相同的,所以内容也是相同的,
从右到左顺序,先print2再print1,所以2被1覆盖了。

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

printf为什么会这样?


  1. #include <stdio.h>;
  2. int* magic2(int n)
  3. {
  4.     static int a;
  5.     a=n;
  6.     return & a;
  7. }
  8. void main2()
  9. {
  10.     printf("example 2:  %d %d\n",*(magic2(1)),*(magic2(2)));
  11. }

  12. char* magic3(char a)
  13. {
  14.     static char s;
  15.     s=a;
  16.     return & s;
  17. }
  18. void main3()
  19. {
  20.     printf("example 3:  %c %c\n",*(magic3('1')),*(magic3('2')));
  21. }
  22. char* magic1(char *a)
  23. {
  24.     static char s[20];
  25.     sprintf(s,"%s",a);
  26.     return s;
  27. }
  28. int main()
  29. {
  30.     printf("example 1: %s %s\n",magic1("1"),magic1("2"));
  31.     main2();
  32.     main3();
  33.     return 0;
  34. }
复制代码

gcc3.3.1+mingw
结果:
----------运行 ----------
example 1: 1 1
example 2:  1 1
example 3:  1 2

输出完成 (耗时 0 秒) - 正常终止

VC6.0
结果:
example 1: 1 1
example 2:  1 2
example 3:  1 2
Press any key to continue

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

printf为什么会这样?

下例子的程序(根据前面朋友改的)结果
在什么系统上都应该是
1   1
1   2
1   2
没有疑问。



  1. #include <stdio.h>;

  2. char* magic1(char *a)
  3. {
  4. static char s[20];
  5. sprintf(s,"%s",a);
  6. return s;
  7. }
  8. void main()
  9. {
  10. printf("example 1: %s %s\n",magic1("1"),magic1("2"));
  11. main2();
  12. main2();
  13. }
  14. int* magic2(int n)
  15. {
  16. static int a;
  17. a=n;
  18. return &
  19. }
  20. void main2() { printf("example 2:  %d %d\n",*(magic2(1)),*(magic2(2))); }

  21. char* magic3(char a)
  22. {
  23. static char s;
  24. s=a;
  25. return &
  26. }
  27. void main3() { printf("example 3:  %c %c\n",*(magic3('1')),*(magic3('2'))); }

复制代码

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

printf为什么会这样?

一句错话,^_^,编辑掉了。

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

printf为什么会这样?

原帖由 "yuxh" 发表:

*(magic(1))的值是1,入栈的是1而不是a的地址,因而入栈的是2,1,结果就是1 2

第三个一样
不一定的.看来跟编译器有关.我在VC6.0里结果跟他的一样,是1,2
但在gcc3.3.1+mingw里是1,1,第二题第三题都是这样.

修改:对不起,这里说错了,应该改为:
但在gcc3.3.1+mingw里第二题是1,1,第三题是1,2.

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

printf为什么会这样?

[quote]原帖由 "(︶ε︶)"]printf("%s %s\n",magic("1",magic("2"); [/quote 发表:

这里按从右到左的顺序入栈的话,先调用magic("2",把return 的地址入栈
再调用magic("1"(这时s的内容发生变化了),再把return的地址入栈,printf打印这两个地址(相同)的字符串,结果是1 1

[quote]原帖由 "(︶ε︶)"]printf("%d %d\n",*(magic(1)),*(magic(2))); [/quote 发表:

*(magic(1))的值是1,入栈的是1而不是a的地址,因而入栈的是2,1,结果就是1 2

第三个一样

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

printf为什么会这样?

p = malloc(sizeof(char *));

sizeof(char *) = 一个字长,32位系统中是4
strcpy(p, "Fan a!";溢出了

论坛徽章:
0
84 [报告]
发表于 2004-12-30 02:05 |只看该作者

printf为什么会这样?

#include<stdio.h>;
#include<string.h>;
#include<malloc.h>;
#include <stdlib.h>;

char *getFilePath()
        {        char *p = NULL;
                p = malloc(sizeof(char *));
                strcpy(p,"Fan a!";
                return p;
        }
int main(void){
        char *k=NULL;
        k = getFilePath();
        printf("FilePath is %s",k);
        free(k);
}
请教高手,这段代码在最后free(k);的时候为什么会出错??
有在线的朋友给个答案先,搞不明白晚上睡觉不安稳^_^

论坛徽章:
0
83 [报告]
发表于 2004-12-29 23:23 |只看该作者

printf为什么会这样?

程序1:
#include <stdio.h>;
char* magic(char *a)
{
    static char s[20];
    sprintf(s,"%s",a);
        return s;
}

void main()
{
    printf("%s %s\n",magic("1",magic("2");
}
这个明白。

程序2:
#include <stdio.h>;

int* magic(int n)
{
        static int a;
        a=n;
        return &amp;
}

void main()
{

    printf("%d %d\n",*(magic(1)),*(magic(2)));
}

程序3:
#include <stdio.h>;
char* magic(char a)
{
    static char s;
        s=a;
    return &amp;
}

void main()
{

    printf("%c %c\n",*(magic('1')),*(magic('2')));
}

VC6.0
程序1结果为:     1 1
为什么程序2与3结果为:      1 2
???

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

printf为什么会这样?

^_^,多谢。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP