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
答案 0 :(得分:2)
这是未定义的行为:更多字符被复制到str
而不是它可以容纳。 (联合国)幸运的是,程序没有崩溃;但是,它没有做对。
正是这个问题(错误的程序似乎工作正常)是调试C代码的主要障碍:程序员不会仅仅通过运行程序来检测无效行为。解决此问题的一种方法是通过内存分析器运行程序,例如valgrind。该工具将立即告诉您程序执行了需要修复的无效操作。
答案 1 :(得分:0)
因为未定义的行为。你运气不好,你的编译器可以让你逃脱。不同的运行时环境,或堆栈上的一些其他变量,或不同的编译器将很容易产生不同的结果。
(技术解释是:在堆栈上的str
数组之后恰好没有用户可见的对象,所以你写过堆栈数组的末尾,似乎没有什么奇怪的事情发生。< / p>
在某些未指定的时间之后,损坏的堆栈内容可能会导致崩溃,但前提是你很幸运。如果你运气不好,有人通过缓冲区溢出来破坏你的计算机。)