免费注册 查看新帖 |

Chinaunix

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

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

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

printf为什么会这样?

还有,malloc返回的不是局部变量的指针!

论坛徽章:
0
12 [报告]
发表于 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
13 [报告]
发表于 2004-12-27 13:42 |只看该作者

printf为什么会这样?

to aero,
C都是从右向左压站的。和COMPILER无关
yuxh的例子也同样如此。

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

printf为什么会这样?

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

哦?那返回的是什么?

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

printf为什么会这样?

malloc()返回的是在堆中的全局变量的指针。

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

printf为什么会这样?

我是说的参数计算顺序,又没说入栈顺序。yuxh的例子,明显是从左到右计算的参数。

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

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

printf为什么会这样?

to aero,
计算次序==入站次序。
yuxh的例子也不例外。
关键是用不用公用的存储区域。

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

printf为什么会这样?

啥时候成了全局变量了?

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

printf为什么会这样?

无可置疑,先调用的func(2),然后调用的func(1),见汇编代码,一切都清楚了:

  1. Disassembly of section .text:

  2. 00000000 <.text>;:
  3.    0:        6e                           outsb  %ds:(%esi),(%dx)
  4.    1:        75 6d                        jne    70 <_main+0x36>;
  5.    3:        62 65 72                     bound  %esp,0x72(%ebp)
  6.    6:        20 25 64 00 55 89            and    %ah,0x89550064

  7. 0000000a <_Func>;:
  8.    a:        55                           push   %ebp
  9.    b:        89 e5                        mov    %esp,%ebp
  10.    d:        83 ec 18                     sub    $0x18,%esp
  11.   10:        8b 45 08                     mov    0x8(%ebp),%eax
  12.   13:        89 44 24 08                  mov    %eax,0x8(%esp)
  13.   17:        c7 44 24 04 00 00 00         movl   $0x0,0x4(%esp)
  14.   1e:        00
  15.   1f:        c7 04 24 00 00 00 00         movl   $0x0,(%esp)
  16.   26:        e8 00 00 00 00               call   2b <_Func+0x21>;
  17.   2b:        b8 00 00 00 00               mov    $0x0,%eax
  18.   30:        c9                           leave  
  19.   31:        c3                           ret   
  20.   32:        25 73 2c 20 25               and    $0x25202c73,%eax
  21.   37:        73 0a                        jae    43 <_main+0x9>;
  22.         ...

  23. 0000003a <_main>;:
  24.   3a:        55                           push   %ebp
  25.   3b:        89 e5                        mov    %esp,%ebp
  26.   3d:        53                           push   %ebx
  27.   3e:        83 ec 14                     sub    $0x14,%esp
  28.   41:        83 e4 f0                     and    $0xfffffff0,%esp
  29.   44:        b8 00 00 00 00               mov    $0x0,%eax
  30.   49:        89 45 f8                     mov    %eax,0xfffffff8(%ebp)
  31.   4c:        8b 45 f8                     mov    0xfffffff8(%ebp),%eax
  32.   4f:        e8 00 00 00 00               call   54 <_main+0x1a>;
  33.   54:        e8 00 00 00 00               call   59 <_main+0x1f>;
  34.   59:        c7 04 24 02 00 00 00         movl   $0x2,(%esp);2入栈
  35.   60:        e8 a5 ff ff ff               call   a <_Func>;
  36.   65:        89 c3                        mov    %eax,%ebx
  37.   67:        c7 04 24 01 00 00 00         movl   $0x1,(%esp);1入栈
  38.   6e:        e8 97 ff ff ff               call   a <_Func>;
  39.   73:        89 5c 24 08                  mov    %ebx,0x8(%esp)
  40.   77:        89 44 24 04                  mov    %eax,0x4(%esp)
  41.   7b:        c7 04 24 32 00 00 00         movl   $0x32,(%esp)
  42.   82:        e8 00 00 00 00               call   87 <_main+0x4d>;
  43.   87:        8b 5d fc                     mov    0xfffffffc(%ebp),%ebx
  44.   8a:        c9                           leave  
  45.   8b:        c3                           ret   
  46.   8c:        90                           nop   
  47.   8d:        90                           nop   
  48.   8e:        90                           nop   
  49.   8f:        90                           nop   
复制代码

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

printf为什么会这样?

^_^,是了。看走眼了。是从右向左计算的。呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP