我在另一个问题中遇到了以下代码。数组被声明为char s[2];
并且代码包含语句s[3]=d;
。此代码如何正常工作?
5 回答
这没用。如果它做了什么,那就是盲目的运气。完整的代码在这里。
这是未定义的行为 - 它可以做任何事情。在实践中,你显然很不走运,它不会崩溃来警告你你做错了什么。
它不过是Undefined Behavior
。我试过这段代码,但它在我的电脑上不起作用。这完全取决于编译器、环境。您的代码是行为不可预测的代码示例。IEDifferent output on different environment.
在 C 中,您通常能够做在其他编译器眼中“非法”的事情。这将导致“未定义的行为”,应该避免。
如果您在大多数操作系统上的数组边界之外读取或写入,它将看起来“工作”而不是抱怨。除非您很幸运并且处于内存页面的边缘,否则您可能会错误地执行此操作,并且操作系统会使您的程序崩溃。
我喜欢把记忆想象成一个图书馆。和我一起假装你的操作系统是图书管理员。如果你问图书馆员一本书应该去哪里,她可能会告诉你某个书架和某个部分。您可以将书放回适当的部分。如果您放错了位置,除非图书管理员 (OS) 抓住您并责骂您的错误,否则您可能会侥幸逃脱。否则,这本书现在将被放置在错误的位置,直到它被移动(覆盖)。在与大多数计算机的 RAM 一样大的东西中,您不会因为一个不正确的字节而破坏整个数据库,但是如果您再次遇到这个放错位置的数据(书),您可能会得到混乱的结果,损坏文件,潜在的崩溃等。
在 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 才会抛出“堆栈损坏”错误。简而言之,行为是未定义的。