C语言printf()函数具体解释和安全隐患
2017-05-18 09:34
771 查看
一、问题描写叙述
![](http://img.blog.csdn.net/20150812164652074?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、进一步说明
请细致注意看,有例如以下奇怪的现象
三、printf()函数的原理解释
明确这些问题首先须要明确printf()函数的工作原理。
printf()维持了一个须要打印的变量栈。默认情况下,參数进栈的顺序是由右向左的,因此,參数进栈以后的内存模型例如以下图所看到的:
![](http://img.blog.csdn.net/20150812164714474)
打印的时候,printf依照字符转换说明符规定的格式从低地址開始提取数据。直到參数打印完。
比方遇到 %f 说明符就提取8个字节的数据,遇到 %d 就提取4个字节。printf()事实上不知道參数的个数,它仅仅会依据format中的打印格式的数目依次打印堆栈中參数format后面地址的内容。
这样一来,printf()事实上存在安全隐患——没错,它会强行读取内存的数据当作正常数据输出,没有边界检測————非常有可能产生堆溢出!
比方这种代码:
输出例如以下:
三、问题解释
(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的顺序,正常了,为什么?
答:这是正常的情况而已。
二、进一步说明
请细致注意看,有例如以下奇怪的现象
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语言static定义函数类型的具体解释
- 关于C语言static定义函数类型的具体解释
- C语言printf()函数详解和安全隐患
- 关于C语言static定义函数类型的具体解释
- c语言中可变参数的原理---printf()函数
- 【疑问】有关C语言中printf函数的输出和格式的问题
- [转载】C语言printf函数
- c语言中signal函数详细解释说明
- C语言中Printf()函数的运行机制
- c语言 对printf函数的理解
- c语言 对printf函数的理解
- c语言中signal函数解释....
- C语言的printf函数(格式输出函数)
- C语言中printf格式化输出函数
- C语言中printf格式化输出函数
- c语言输入输出函数printf与scanf的用法格式
- 关于C语言中printf函数的一个问题
- 类似于C语言的printf函数
- c语言输入输出函数printf与scanf
- c语言中可变参数的原理---printf()函数