Char数组可以容纳超过预期

时间:2016-08-28 06:09:01

标签: c arrays string

我尝试在C中运行此代码并预期运行时错误,但实际上它运行时没有错误。你能告诉我为什么会这样的原因吗?

char str[10];
scanf("%s",str);
printf("%s",str);

当我将数组的大小初始化为10时,代码如何打印超过10个字母的字符串?

3 个答案:

答案 0 :(得分:3)

只要您从其边界之外的数组中读取或写入,就会调用未定义的行为

每当发生这种情况时,程序可以做任何想做的事情。它甚至可以播放你的生日歌,虽然它不是你的生日,或者从你的银行账户转账。或者它可能会崩溃,或者删除文件,或者只是假装没有发生任何不好的事情。

在你的情况下,它做了后者,但绝不保证。

要了解有关此现象的更多详细信息,请阅读有关利用缓冲区溢出的内容,这是一个很大的主题。

答案 1 :(得分:1)

C不会对阵列执行任何边界检查。这可能会导致缓冲区溢出攻击您的可执行文件。

绑定检查应在用户端完成,以使其反缓冲溢出。

在数组中从fgets获取输入时,不要输入幻数,而是始终使用数组上的sizeof(array) - 1运算符来获取那么多,-1为{{1}留出空格字符。

答案 2 :(得分:0)

这是一个很好的问题。答案是 是它确实存在记忆问题 从str的地址读取并存储该字符串 直到实际读取字符串的长度要求,
它超出了你为它分配的地方。

现在,它可能不会立即崩溃,甚至不会崩溃 简短的程序,但很可能在你扩展时 程序,并定义其他变量,这个字符串将为
超越它们,创造各种奇怪的错误,它可能是 最终也崩溃了。

简而言之,这是一个真正的错误,但这种情况并不少见 像这样的记忆虫最初不会影响,但是 稍后会创建错误或崩溃程序。