当我在数组外写时,为什么我的程序不会崩溃?

时间:2014-09-13 23:04:24

标签: c++ c

int main()
{
    char str[2];
    strcpy(str,"0123456789");
    for (int i=0;str[i]!='\0';i++)
    {
        printf("%c %d \n",str[i],i);

    }

    return 0;
}

不确定这是如何工作的但不会崩溃。鉴于该数组已声明仅包含2个元素,它如何保持整个" 0-9"元素并打印出以下内容: 0 0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9

2 个答案:

答案 0 :(得分:2)

这是未定义的行为:更多字符被复制到str而不是它可以容纳。 (联合国)幸运的是,程序没有崩溃;但是,它没有做对。

正是这个问题(错误的程序似乎工作正常)是调试C代码的主要障碍:程序员不会仅仅通过运行程序来检测无效行为。解决此问题的一种方法是通过内存分析器运行程序,例如valgrind。该工具将立即告诉您程序执行了需要修复的无效操作。

答案 1 :(得分:0)

因为未定义的行为。你运气不好,你的编译器可以让你逃脱。不同的运行时环境,或堆栈上的一些其他变量,或不同的编译器将很容易产生不同的结果。

(技术解释是:在堆栈上的str数组之后恰好没有用户可见的对象,所以你写过堆栈数组的末尾,似乎没有什么奇怪的事情发生。< / p>

在某些未指定的时间之后,损坏的堆栈内容可能会导致崩溃,但前提是你很幸运。如果你运气不好,有人通过缓冲区溢出来破坏你的计算机。)