它为什么会这样?

时间:2012-12-20 13:03:29

标签: c

    char c,s[4];
    int i=1000;

    while(1)
    {

        i+=10;

        sprintf(s,"%d",i);
            printf("%s",s);
    }

当我编译上面的代码时,我得到如下输出:

1010 778 788 798 808 818...

任何人都可以解释为什么这个kolavery D ??

2 个答案:

答案 0 :(得分:5)

sprintf()将五个字符(四位数和一个NUL)写入四字符缓冲区。因此,您有一个缓冲区溢出,并且代码的行为未定义。

如果您对778的来源感到好奇,请考虑以下事项:(1010 & ~0xff) + 10 = 778

不能强调你不能依赖于此,因为即使对编译器选项进行的最小改动(更不用说对工具链进行更大的更改)也可能使undefined behaviour以其他方式表现出来

答案 1 :(得分:1)

您的数组s [4]不足以打印4位整数,因此会覆盖其他局部变量,从而破坏“i”。