scanf函数的参数部分要求对变量进行取地址,由此我们知道,我们对是这个变量所在的那块内存进行的操作,这里就会产生一个问题:内存越界:
1.如:
输入:
12345
结果:
从结果看当scanf以%s字符串格式输入超过数组a[5]范围时,会发生内存越界。这样a[5]里的数据不能看做字符串,因为不是以\0结尾的,这种内存越界发生时,会出现莫名其妙的程序运行结果。
2、%mc宽度内存越界测试程序
输入:
由此我们可以看出,scanf并没有把多余的字符丢掉,而是存储在连续的存储空间,至于为什么a[1]为5,那是因为5把之前赋予的1给覆盖掉了。
1.如:
![](https://i-blog.csdnimg.cn/blog_migrate/5707dc76e57e9a9e76bcd03624aeb7c2.jpeg)
输入:
12345
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/6d05f52a5c2a6c774fc1950bd46b6e39.jpeg)
从结果看当scanf以%s字符串格式输入超过数组a[5]范围时,会发生内存越界。这样a[5]里的数据不能看做字符串,因为不是以\0结尾的,这种内存越界发生时,会出现莫名其妙的程序运行结果。
2、%mc宽度内存越界测试程序
![](https://i-blog.csdnimg.cn/blog_migrate/dfca4506d219a1f20e30ac5a4d1bb663.jpeg)
输入:
![](https://i-blog.csdnimg.cn/blog_migrate/b72c8cc25609393d77863b7904ae132e.jpeg)
由此我们可以看出,scanf并没有把多余的字符丢掉,而是存储在连续的存储空间,至于为什么a[1]为5,那是因为5把之前赋予的1给覆盖掉了。