【问题标题】:Array indexing size [duplicate]数组索引大小[重复]
【发布时间】:2015-05-16 19:05:39
【问题描述】:

我对数组代码感到困惑。

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

#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 元素。

这是输出屏幕。

【问题讨论】:

    标签: c arrays


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢...但是我也尝试显式初始化数组并且它的工作正常,即如果我用来声明元素超出索引,那么它会显示错误。例如“int a[ 1]={1,2,3,4,5,6}; "..
    • 在这种情况下,元素的大小和数量在编译时都是可用的。编译器可以很容易地验证它们。在您的第一种情况下,元素的数量仅在程序运行后可用。除非您使用一些专门的编译器,否则数组的大小在已编译的程序中不再可用 - 验证留给程序员。
    【解决方案2】:

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

    在您的情况下,程序正在访问数组之外​​的一些空间,幸运的是,您最终没有遇到分段错误。

    【讨论】:

    • 我会说运气不好,因为分段错误信号会比 任意用户提供的数据覆盖堆栈要好得多——这种情况有时被称为顺便说一下,作为堆栈溢出。你可能在某处读过这个词。
    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多