-8

我在另一个问题中遇到了以下代码。数组被声明为char s[2];并且代码包含语句s[3]=d;代码如何正常工作?

4

5 回答 5

5

这没用。如果它做了什么,那就是盲目的运气。完整的代码在这里

于 2013-07-02T17:49:29.527 回答
2

这是未定义的行为 - 它可以做任何事情。在实践中,你显然很不走运,它不会崩溃来警告你你做错了什么。

于 2013-07-02T17:51:26.603 回答
0

它不过是Undefined Behavior。我试过这段代码,但它在我的电脑上不起作用。这完全取决于编译器、环境。您的代码是行为不可预测的代码示例。IEDifferent output on different environment.

于 2013-07-02T17:50:59.597 回答
0

在 C 中,您通常能够做在其他编译器眼中“非法”的事情。这将导致“未定义的行为”,应该避免。

如果您在大多数操作系统上的数组边界之外读取或写入,它将看起来“工作”而不是抱怨。除非您很幸运并且处于内存页面的边缘,否则您可能会错误地执行此操作,并且操作系统会使您的程序崩溃。

我喜欢把记忆想象成一个图书馆。和我一起假装你的操作系统是图书管理员。如果你问图书馆员一本书应该去哪里,她可能会告诉你某个书架和某个部分。您可以将书放回适当的部分。如果您放错了位置,除非图书管理员 (OS) 抓住您并责骂您的错误,否则您可能会侥幸逃脱。否则,这本书现在将被放置在错误的位置,直到它被移动(覆盖)。在与大多数计算机的 RAM 一样大的东西中,您不会因为一个不正确的字节而破坏整个数据库,但是如果您再次遇到这个放错位置的数据(书),您可能会得到混乱的结果,损坏文件,潜在的崩溃等。

于 2013-07-02T17:53:23.250 回答
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 才会抛出“堆栈损坏”错误。简而言之,行为是未定义的。

于 2013-07-02T17:55:32.647 回答