关注+星标公众号,不错过精彩内容
编排 | strongerHuang
微信公众号 | 嵌入式专栏
程序员都知道,也都会使用printf函数,但你知道它也有“安全隐患”吗?
下面就来举例我说说:
嵌入式专栏
1
打印输出的数据并不是理论值,如下图(右边):
嵌入式专栏
2
请细致注意看下面代码,有如以下奇怪的现象:
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;
嵌入式专栏
3
因此,参数进栈以后的内存模型例如以下图所看到的:
。直到参数打印完。
char string[]="Hello World!";
printf("String: %s ,强行再读一次: %#p\n", string);
printf("String: %s ,强行再读一次: %#s\n", string);
String:Hello World! , 强行再读一次: 0X001C1073
String: Hello World! ,强行再读一次: 閮
嵌入式专栏
4
问题1:printf(“%f\n”,a) 输出为什么是0.000000?
%f 提取8字节。a仅仅有4字节,提取出来的数占了float表示法的指数部分。尾数部分为0。所以终于是0
%d 提取4字节,x有8字节。提取出来的数实际上是float表示法的指数部分(恰好是0),所以终于是0
参照问题1的解释。提取了八字节后,后面的已经乱了
这是正常的情况而已。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!