一、问题描写叙述

二、进一步说明

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

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

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

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

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

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

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

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

比方这种代码:

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

输出例如以下:

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

三、问题解释

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

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

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

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

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

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

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

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

C语言printf()函数具体解释和安全隐患的更多相关文章

  1. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  2. C语言printf函数转换说明表及其修饰符表

    请求printf()函数打印数据的指令要与打印数据的类型匹配. 例如, 打印整数时使用%d, 打印字符是使用%c. 这些符号被称为转换说明, 他们指定了数据转换称可显示的形式. 1. ANSI C标准 ...

  3. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  4. C语言scanf函数详细解释(转载)

    原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...

  5. C语言 Printf函数

    #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... printf(&qu ...

  6. C语言printf函数

    #include<stdio.h> //int float double short char long int main() { //int printf(const char *for ...

  7. 【C语言】printf函数详解

    C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...

  8. MFC 中的 “printf” 函数

    怀念C语言的我,MFC没法使用的C语言printf函数,于是: int MFCprintf(const char* m_data, ...){ CString str; char printf_buf ...

  9. C语言中可变参数的原理——printf()函数

    函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 使用过C语言的人所再熟悉不过 ...

随机推荐

  1. python中strip(),lstrip(),rstrip()函数的讲解

    1. strip() 它的函数原型:string.strip(s[, chars]),它返回的是字符串的副本,并删除前导和后缀字符.(意思就是你想去掉字符串里面的哪些字符,那么你就把这些字符当参数传入 ...

  2. eclipse中tab键设置

    1.点击 window->preference-,依次选择 General->Editors->Text Editors,选中右侧的 insert space for tabs;如下 ...

  3. luogu1129 [ZJOI2007]矩阵游戏

    其实,只用考虑某一行能否放到某一行就行了 #include <iostream> #include <cstring> #include <cstdio> usin ...

  4. zoj 2388 Beat the Spread!

    Beat the Spread! Time Limit: 2 Seconds      Memory Limit: 65536 KB Superbowl Sunday is nearly here. ...

  5. hlgoj 1766 Cubing

    模拟.下图是我做的小模型. #include <iostream> #include <stdio.h> #include <queue> #include < ...

  6. HDU——1195Open the Lock(双向BFS)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. 刷题总结——鸭舌(ssoi)

    题目: 题目背景 CF 77C 题目描述 小美喜欢吃鸭舌.有一个 n 个点的树,每个节点 i ,第 i 个点上有 ai 个鸭舌.小美一开始处于 x 号点.每次小美可以选择一个与现在的点有边的点而且那个 ...

  8. bzoj2120 数颜色 莫队 带修改

    [bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  9. cf487C Prefix Product Sequence

    Consider a sequence [a1, a2, ... , an]. Define its prefix product sequence . Now given n, find a per ...

  10. javaScriptCore 实战与小结

      源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ...