数组堆栈溢出

yty*_*sme -1 c

    #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)

投入.

为什么str55555555555?为什么str8888888888888888855555555555588888

MBy*_*ByD 6

您覆盖t缓冲区,并到达str缓冲区,其中输入的其余部分和空终止符已设置.并且puts只打印到null终止符.

几乎看起来像这样:

[ t (20)             ][str(100)                                 ]
 55555555555555555555  5555555555555\0
Run Code Online (Sandbox Code Playgroud)

请注意,虽然t声明为char[20],当您打印它时,您将获得完整输入(超过20),因为puts在null终止符处停止(再次).

顺便说一下,这是一个缓冲区溢出,而不是堆栈溢出,但是在这个代码上可以进行堆栈溢出.