免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
1 [报告]
发表于 2004-12-27 12:40 |显示全部楼层

printf为什么会这样?

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

你说是不是两个1呢?

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-27 13:30 |显示全部楼层

printf为什么会这样?

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

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-12-27 13:47 |显示全部楼层

printf为什么会这样?

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

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

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-12-27 13:56 |显示全部楼层

printf为什么会这样?

^_^,是了。看走眼了。是从右向左计算的。呵呵。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-12-27 14:22 |显示全部楼层

printf为什么会这样?

原帖由 "converse" 发表:
我觉得还是有一点问题,在func中的汇编代码,leave之前的那一个:
2b:   b8 00 00 00 00          mov    $0x0,%eax
这个怎么解释?看不懂,这样的话每次返回回来的都是0x0呀??


我的不是这样啊,你用的是那个源码啊?给我试试。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-12-27 14:25 |显示全部楼层

printf为什么会这样?

原帖由 "playmud" 发表:

学了一招!!我用gdb里面的disassemble 如何能到到上面的效果?


?啥效果。gdb就是gdb的显示方法,^_^。

另外,你们为啥都不用gcc的-S参数啊?然后直接看.s文件,多方便啊?不像dump出来的,全是立即数。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-12-27 14:28 |显示全部楼层

printf为什么会这样?

原帖由 "playmud" 发表:


上面的这个没有问题,因为他传递的是一个值,
int i=func();
这个没有问题的,但是如果是char *的话就有问题了,
char * str=(char *)malloc(100);
str=func();
这样str原来分配的空间就泄漏了.


str这个变量的4个字节空间是释放了。可是它分配的空间没有释放,这个你也明白,你说它是泄漏了。其实如果函数返回的时候,将str的值传出来,调用函数再精确的进行控制和处理,这段空间还是可控的,不算是泄漏的。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-12-27 14:44 |显示全部楼层

printf为什么会这样?

原帖由 "playmud" 发表:

这样说是没错,但是不能提倡这么做.


   有原则是好事,但也有灵活对待。

dup类的系统函数不就是这样的利用方法吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-12-27 19:51 |显示全部楼层

printf为什么会这样?

原帖由 "playmud" 发表:
s = malloc(1234);
这种把s声明为char *,非配空间的时候不加说明的,我这里编译不过去.


你用的是啥环境啊?啥编译器啊?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-12-27 20:18 |显示全部楼层

printf为什么会这样?

能过去啊,你的code贴上来吧。不可能出问题的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP