zoukankan      html  css  js  c++  java
  • C语言printf()函数具体解释和安全隐患

    一、问题描写叙述

          

     

    二、进一步说明

          请细致注意看,有例如以下奇怪的现象

         

            int a=5;
            floatx=a;     //这里转换是没有问题的。%f打印x是 5.000000
           
            printf("%d
    ",a);  
            printf("%f
    ",a);  //输出为什么是0.000000? -----问题1
            printf("%f
    ",x);
            printf("%d
    ",x);  //输出为什么是0?        -----问题2
            printf("%f,%f
    ",a,x);  //输出都是0.000000  为什么?            ----问题3
            printf("%f,%f
    ",x,a);  //调换一下a,x的顺序,正常了,为什么?  ----问题4
            printf("%d,%f
    ",a,x);
     
            getchar();
            return0;


    三、printf()函数的原理解释

          明确这些问题首先须要明确printf()函数的工作原理。

     

         printf()维持了一个须要打印的变量栈。默认情况下,參数进栈的顺序是由右向左的,因此,參数进栈以后的内存模型例如以下图所看到的:

          

                                                                      

          打印的时候,printf依照字符转换说明符规定的格式从低地址開始提取数据。直到參数打印完。

     

          比方遇到 %f 说明符就提取8个字节的数据,遇到 %d 就提取4个字节。printf()事实上不知道參数的个数,它仅仅会依据format中的打印格式的数目依次打印堆栈中參数format后面地址的内容。

       

          这样一来,printf()事实上存在安全隐患——没错,它会强行读取内存的数据当作正常数据输出,没有边界检測————非常有可能产生堆溢出!

         

    比方这种代码:

        char string[]="Hello World!";
        printf("String: %s  ,强行再读一次: %#p
    ", string);
        printf("String: %s  ,强行再读一次: %#s
    ", string);

    输出例如以下: 

        String:Hello World!  , 强行再读一次: 0X001C1073 
        String: Hello World!  ,强行再读一次: 閮

     


    三、问题解释

    (1) 问题1:printf("%f ",a) 输出为什么是0.000000?

    答:%f 提取8字节。a仅仅有4字节,提取出来的数占了float表示法的指数部分。尾数部分为0。所以终于是0

     

    (2) 问题2:printf("%d ",x)  输出为什么是0?

    答:%d 提取4字节,x有8字节。提取出来的数实际上是float表示法的指数部分(恰好是0),所以终于是0

     

    (3) 问题3:printf("%f,%f ",a,x); 输出都是0.000000 为什么?

    答:參照问题1的解释。提取了八字节后,后面的已经乱了

    (4) 问题4:printf("%f,%f ",x,a);调换一下a,x的顺序,正常了,为什么?

    答:这是正常的情况而已。

     

     

     

     

     

     

  • 相关阅读:
    在Java和.Net中的MD5的一致性
    为Asp.net 网站新增发送手机短信功能
    ASP.NET如何防止页面重复提交
    转:Ajax调用Webservice和后台方法
    Ext 常用方法之一
    C#编程实战之类功能缺失
    Silverlight常用控件最佳实践之1.自定义TabControl禁用状态
    Blend4精选案例图解教程(五):可视数据管理
    DEDE织梦自定表单提交后自动发送邮件并到站长邮箱
    php常用数组相关处理函数(1)
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6871772.html
Copyright © 2011-2022 走看看