我在另一个问题中遇到了以下代码。数组声明为char s[2];
,代码包含语句s[3]=d;
。 this代码如何正常工作?
答案 0 :(得分:5)
它不起作用。如果它做了什么,那就是盲目的运气。完整code is here。
答案 1 :(得分:2)
这是未定义的行为 - 它可以做任何事情。在实践中,你显然是不走运的,它不会崩溃,以警告你,你做错了什么。
答案 2 :(得分:0)
这只是Undefined Behavior
。我试过这个代码,但它在我的电脑上无效。它完全取决于编译器,环境。您的代码是行为不可预测的代码示例。即Different output on different environment.
答案 3 :(得分:0)
在C中,你经常能够在其他编译器的眼中做一些“非法”的事情。这将导致“未定义的行为”,应该避免。
如果您在大多数操作系统上读取或写入数组范围之外,它将显示为“工作”而不是抱怨。除非你很幸运并且处于内存页面的边缘,否则你可能会错误地执行此操作,操作系统将使程序崩溃。
我喜欢将内存设想为库。假装我的操作系统是图书管理员。如果你向图书管理员询问书籍应该去哪里,她可能会告诉你某个书架和某个部分。您可以将书放回适当的部分。如果你放错了它,除非图书管理员(OS)抓住你并责备你的错误,否则你可能会放弃它。否则,该书现在将被放置在错误的位置,直到它被移动(覆盖)。在大多数计算机的RAM大小的东西中,你不会因为有一个不正确的字节而破坏整个数据库,但是如果你再次遇到这个错位的数据(书),你可能会搞砸了结果,文件,潜在的崩溃等。
答案 4 :(得分:0)
在Visual Studio 2010中尝试过:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int s[2];
s[0] = 0;
s[1] = 1;
s[2] = 2;
for(int i = 0; i <= 2; i++)
printf("%d", s[i]);
}
只有在整个main()完成后,Visual Studio才会抛出“Stack Corrupted”错误。简而言之,行为是不确定的。