#include
int main(void)
{
char str[100]="88888888888888";
char t[20]="";
gets(t);
puts(str);
puts(t);
return 0;
}Run Code Online (Sandbox Code Playgroud)

第一行
555555555555555555555555555555555
Run Code Online (Sandbox Code Playgroud)
投入.
为什么str是55555555555?为什么str不88888888888888888和55555555555588888?
您覆盖t缓冲区,并到达str缓冲区,其中输入的其余部分和空终止符已设置.并且puts只打印到null终止符.
几乎看起来像这样:
[ t (20) ][str(100) ]
55555555555555555555 5555555555555\0
Run Code Online (Sandbox Code Playgroud)
请注意,虽然t声明为char[20],当您打印它时,您将获得完整输入(超过20),因为puts在null终止符处停止(再次).
顺便说一下,这是一个缓冲区溢出,而不是堆栈溢出,但是在这个代码上可以进行堆栈溢出.