scanf不安全吗

      老是有人说scanf不安全,在vs中都不能直接使用sacnf,必须使用scanf_s();

      以下说明下scanf不安全的实例。以下代码c数组申请了四个字节的空间,最后输入的时候输入6个w,而此时,另外多余的w会越界到 flag的字节空间里,从把int型的flag的四个字节填充为77770000。从下图内存分布信息可以看到,c的地址是0x0019ff38,flag的地址是0x0019ff3c。两个地址的间距刚好是C数组的大小。说明两个数组C跟flag分配的虚拟地址是连续的。

   这里说下flag的值为什么是这么个30583数字,因为w的ascii码值的十六进制是77。然后就涉及到cpu的大小端模式了。对于我的电脑处理器x64,那么他就是小端模式。那什么又是小端模式呢? 小端模式是:低地址对应低位(进制),高地址对应高位。那这样的话 flag的地址的数字应该是反过来的 也就是  0x00007777 。转化为10进制 ,也就是如图所示的flag的值是30583的来源了。

 

scanf不安全吗