我尝试在C中运行此代码并预期运行时错误,但实际上它运行时没有错误。你能告诉我为什么会这样的原因吗?
char str[10];
scanf("%s",str);
printf("%s",str);
当我将数组的大小初始化为10时,代码如何打印超过10个字母的字符串?
答案 0 :(得分:3)
只要您从其边界之外的数组中读取或写入,就会调用未定义的行为。
每当发生这种情况时,程序可以做任何想做的事情。它甚至可以播放你的生日歌,虽然它不是你的生日,或者从你的银行账户转账。或者它可能会崩溃,或者删除文件,或者只是假装没有发生任何不好的事情。
在你的情况下,它做了后者,但绝不保证。
要了解有关此现象的更多详细信息,请阅读有关利用缓冲区溢出的内容,这是一个很大的主题。
答案 1 :(得分:1)
C不会对阵列执行任何边界检查。这可能会导致缓冲区溢出攻击您的可执行文件。
绑定检查应在用户端完成,以使其反缓冲溢出。
在数组中从fgets
获取输入时,不要输入幻数,而是始终使用数组上的sizeof(array) - 1
运算符来获取那么多,-1为{{1}留出空格字符。
答案 2 :(得分:0)
这是一个很好的问题。答案是
是它确实存在记忆问题
从str
的地址读取并存储该字符串
直到实际读取字符串的长度要求,
它超出了你为它分配的地方。
现在,它可能不会立即崩溃,甚至不会崩溃
简短的程序,但很可能在你扩展时
程序,并定义其他变量,这个字符串将为
超越它们,创造各种奇怪的错误,它可能是
最终也崩溃了。
简而言之,这是一个真正的错误,但这种情况并不少见 像这样的记忆虫最初不会影响,但是 稍后会创建错误或崩溃程序。