【问题标题】:Array index greater than the declared value. How is it possible? [duplicate]数组索引大于声明值。这怎么可能? [复制]
【发布时间】:2013-06-30 05:18:20
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案1】:

它不起作用。如果它做了什么,那就是盲目的运气。以及完整的code is here

【讨论】:

  • 查看我发布的代码链接
  • +1 以抵消某人的反对票。这个答案可能很简洁,但它是正确的。
  • @AswinMurugesh 实际上在一分钟前还在SO 上。很奇怪。
  • @AswinMurugesh 如果您投了反对票:不要。 “它有效”和“你认为它有效”是不同的,如果你坚持认为它确实有效,那你就大错特错了。
  • @H2CO3:别说了。不是我
【解决方案2】:

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

【讨论】:

  • +1 表示不幸的部分。非常真实。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在 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 才会抛出“堆栈损坏”错误。简而言之,行为是未定义的。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多