• 一小段测试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作为返回值的寄存器。

    水平有限,如果有错误,请帮忙提醒我。如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。版权所有,需要转发请带上本文源地址,博客一直在更新,欢迎 关注 。
  • 相关阅读:
    C++11:22委托构造函数和继承构造函数
    C++11:21通过智能指针管理第三方库分配的内存
    python 常识
    计算机基础
    XML
    flask请求上下文 及相关源码
    Flask框架
    Django orm 常用字段和参数
    docker 使用
    视图家族
  • 原文地址:https://www.cnblogs.com/10087622blog/p/9371491.html
Copyright © 2020-2023  润新知