免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2004-12-27 12:56 |显示全部楼层

printf为什么会这样?

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

论坛徽章:
0
2 [报告]
发表于 2004-12-27 12:58 |显示全部楼层

printf为什么会这样?

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

论坛徽章:
0
3 [报告]
发表于 2004-12-27 13:17 |显示全部楼层

printf为什么会这样?

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

论坛徽章:
0
4 [报告]
发表于 2004-12-27 13:38 |显示全部楼层

printf为什么会这样?

原帖由 "yuxh" 发表:
个为什么就是 2, 3?
和地址有关。

相当于:
int temp2=Func(2);
int temp1=Func(1);
    printf("%d, %d\n", temp1, temp2);

开始那个相当于:
static char * temp1=Func(1)=Func(2);

    printf("%s, %s\n", temp1, temp1);

论坛徽章:
0
5 [报告]
发表于 2004-12-27 13:42 |显示全部楼层

printf为什么会这样?

[quote]原帖由 "思一克"]还有,malloc返回的不是局部变量的指针![/quote 发表:

哦?那返回的是什么?

论坛徽章:
0
6 [报告]
发表于 2004-12-27 13:54 |显示全部楼层

printf为什么会这样?

啥时候成了全局变量了?

论坛徽章:
0
7 [报告]
发表于 2004-12-27 14:00 |显示全部楼层

printf为什么会这样?

[quote]原帖由 "converse"][/quote 发表:


那只是你的编译器是从右到左.

论坛徽章:
0
8 [报告]
发表于 2004-12-27 14:02 |显示全部楼层

printf为什么会这样?


  1. 0x4012a8 <main>;:        push   %ebp
  2. 0x4012a9 <main+1>;:      mov    %esp,%ebp
  3. 0x4012ab <main+3>;:      push   %ebx
  4. 0x4012ac <main+4>;:      sub    $0x14,%esp
  5. 0x4012af <main+7>;:      and    $0xfffffff0,%esp
  6. 0x4012b2 <main+10>;:     mov    $0x0,%eax
  7. 0x4012b7 <main+15>;:     mov    %eax,0xfffffff8(%ebp)
  8. 0x4012ba <main+18>;:     mov    0xfffffff8(%ebp),%eax
  9. 0x4012bd <main+21>;:     call   0x401770 <_alloca>;
  10. 0x4012c2 <main+26>;:     call   0x4013e0 <__main>;
  11. 0x4012c7 <main+31>;:     movl   $0x2,(%esp,1)

  12. 0x4012ce <main+38>;:     call   0x401290 <_Z4Funci>;
  13. 0x4012d3 <main+43>;:     mov    %eax,%ebx
  14. 0x4012d5 <main+45>;:     movl   $0x1,(%esp,1)

  15. 0x4012dc <main+52>;:     call   0x401290 <_Z4Funci>;
  16. 0x4012e1 <main+57>;:     mov    %ebx,0x8(%esp,1)
  17. 0x4012e5 <main+61>;:     mov    %eax,0x4(%esp,1)

  18. 0x4012e9 <main+65>;:     movl   $0x401299,(%esp,1)
  19. 0x4012f0 <main+72>;:     call   0x401820 <printf>;
  20. 0x4012f5 <main+77>;:     movl   $0x4012a1,(%esp,1)
  21. 0x4012fc <main+84>;:     call   0x401810 <system>;
  22. 0x401301 <main+89>;:     mov    $0x0,%eax
  23. 0x401306 <main+94>;:     mov    0xfffffffc(%ebp),%ebx
  24. 0x401309 <main+97>;:     leave
  25. 0x40130a <main+98>;:     ret
  26. 0x40130b <main+99>;:     nop
  27. 0x40130c <main+100>;:    nop
  28. 0x40130d <main+101>;:    nop
  29. 0x40130e <main+102>;:    nop
  30. 0x40130f <main+103>;:    nop
  31. End of assembler dump.
复制代码

道的汇编代码怎么弄出来的?

论坛徽章:
0
9 [报告]
发表于 2004-12-27 14:12 |显示全部楼层

printf为什么会这样?

原帖由 "思一克" 发表:
to: playmud
你觉得这样的程序有问题?

char *func()
{
char *s;

   ........ some code;

   return s;
}
有问题吗


是的,我觉得有问题.
char * s=(char *)malloc(40);
return s;
func()调用结束以后他的局部变量会被释放掉,尽管str是在堆上分配的空间,我认为这个空间会在
这个函数调用结束以后释放资源,而return的结果是指向这个空间的一个地址,所以不安全.

论坛徽章:
0
10 [报告]
发表于 2004-12-27 14:15 |显示全部楼层

printf为什么会这样?

c/c++确实压栈的顺序是函数参数相反的顺序.这个我上面错了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP