DreamDev

http://dreamdev.co.bokee.net

企业介绍

欢迎访问DreamDev的企业博客,感受我们的企业文化、品牌理念;与我们互动交流,发表见解;与我们一起分享开放、自由交流的喜悦。 更详细
  • 行业:电脑/数码/软件
  • 地区:武漢
  • 电话:02787434100
  • 传真:02787434100

企业博客信息

创建者

成员列表

暂时没有相关信息!

K&R风格函数参数声明

字体大小: - - zmdxyboyandy   发表于 07-01-19 13:56     阅读(2754)   评论(0)     分类:
f1(i)
long i;
{
        return(i *10);
}
f2(long i)
{
        return(i * 10);
}
main()
{
        printf("%d,%d",f1(10.0),f2(10.0));
}
结果为0, 100
当使用 K & R风格编码时,C 编译器是不对函数实参类型作检查的,这样,在调用f1时,
编译器就将整个实参(浮点数)入栈(sizeof(float)个字节),然后在f1函数体里面,
取参数时只取栈里面的sizeof(long)个字节作参数i的值,在IA架构里面,正好就是取到
了这个浮点数的后半部分,值为0,因此,在 f1里面i的值就成了0。
如果在调用 f1 的时候,先作类型转换(long)10.0 ,则编译器就将 sizeof(long)长度
的内容压栈,正确地传入实参。
在gdb中看了一下汇编代码,调用f2时的压栈参数为push $0xa,也就是10。而调用f1时的压栈参数为:mov $0x0, %eax
          mov $42040000, %ebx
          push %ebx
          push %eax
也就是说是按照float的格式压栈的。

返回文章列表标签:   張毛迪  

分享到:

下一篇:完全杜绝U盘病毒&禁止Autorun.INF文件 上一篇:c++ 文件拷贝源代码

发表评论评论 (0)
发表评论

登录名   密码   游客无须输入密码     注册企博网帐号

验证码