数组索引大小

时间:2015-03-14 08:04:17

标签: c arrays

我对数组代码感到困惑。

据我说,程序应该引发错误,但它运行正常。代码:

#include<stdio.h>
#include<conio.h>

void main()
{
    int a[1],n,i;
    clrscr();
    printf("Enter the length");
    scanf("%d",&n);
    for( i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    getch();
}

此处数组大小为1但是当我输入长度5时,它可以正常工作:程序会显示我输入的所有5个元素。

这是输出屏幕。

2 个答案:

答案 0 :(得分:3)

访问数组超出范围会导致未定义的行为。任何事情都可能发生,包括你正在观察的结果。在这种情况下,您将覆盖存储在数组后面的一些对象。它们只是在这种特殊情况下没有使用,你的程序也不会崩溃。

这样的错误很难调试。它现在工作正常,但可能会开始失败,例如,当使用不同的编译器时。 Memory analyzer可以帮助检测此类错误。它会检测到一些无效的内存访问,即使它们不会导致崩溃。

答案 1 :(得分:1)

定义int a[1]后,堆栈上只分配一个int的空间。超出数组绑定的任何访问都会导致未定义的行因此,根据C标准,代码是错误的。

在你的情况下,程序正在访问数组之外​​的一些空间,并且运气不好,你最终没有遇到分段错误。