一小段测试atof的代码

#include <stdio.h>
//#include <stdlib.h>

double a=0;
int main(int argc, char *argv[])
{
    a = atof(argv[1]);
    double b=a+2;

    printf("b = %f
", b);
    printf("a = %f
", a);

    return 0;
}

  不管是否把注释的//放开,都能编译链接正常,把注释的//打开,atof的行为则正常,否则异常。

也就是说atof存在两个定义,一个正确实现,一个没有实现?咨询了一个做工具链的同事,他的结论是:

反汇编对比两个生成的代码,发现返回值的问题,正常的返回是float,异常的是返回0,也就是异常使用的是eax寄存器,而

atof的实现,它的返回值不是在eax中的,是在xmm0中。

其实真正的原因是:带了头文件包含stdlib.h,则会根据函数声明,生成正确的调用代码,否则就会默认地使用eax作为返回值的寄存器。

水平有限,如果有错误,请帮忙提醒我。如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。版权所有,需要转发请带上本文源地址,博客一直在更新,欢迎 关注 。
原文地址:https://www.cnblogs.com/10087622blog/p/9371491.html