这是来自ac程序的摘录,应该演示缓冲区溢出.
void foo()
{
char arr[8];
printf(" enter bla bla bla");
gets(arr);
printf(" you entered %s\n", arr);
}
Run Code Online (Sandbox Code Playgroud)
问题是"如果没有创建缓冲区溢出,用户最多可以输入多少个输入字符"
我最初的答案是8,因为char数组长8个字节.虽然我非常肯定我的答案是正确的,但我尝试了更多的字符,并且发现在我出现分段错误之前我可以输入的字符数限制是11.(我在A VirtualBox Ubuntu上运行它)
所以我的问题是:为什么可以在8字节数组中输入11个字符?
您的角色实际上超出了已定义数组的范围,导致未定义的结果.在覆盖用于其他内容的某些内存之前,您不会看到效果.
语言和运行时没有做任何事情来阻止你溢出缓冲区,这正是为什么这些错误是如此糟糕,有时难以追踪.
由于这些原因,gets对于更安全的函数(getline在这种情况下)要求数组长度存储数据的函数会被弃用.
请参阅:http://crasseux.com/books/ctutorial/gets.html
此外,您只能可靠地存储7个字符,因为您需要第8个空终止符.