数组索引大于声明的值。这怎么可能?

时间:2013-07-02 17:48:29

标签: c

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

5 个答案:

答案 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”错误。简而言之,行为是不确定的。