我对数组代码感到困惑。
据我说,程序应该引发错误,但它运行正常。代码:
#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
个元素。
这是输出屏幕。
答案 0 :(得分:3)
访问数组超出范围会导致未定义的行为。任何事情都可能发生,包括你正在观察的结果。在这种情况下,您将覆盖存储在数组后面的一些对象。它们只是在这种特殊情况下没有使用,你的程序也不会崩溃。
这样的错误很难调试。它现在工作正常,但可能会开始失败,例如,当使用不同的编译器时。 Memory analyzer可以帮助检测此类错误。它会检测到一些无效的内存访问,即使它们不会导致崩溃。
答案 1 :(得分:1)
定义int a[1]
后,堆栈上只分配一个int
的空间。超出数组绑定的任何访问都会导致未定义的行因此,根据C标准,代码是错误的。
在你的情况下,程序正在访问数组之外的一些空间,并且运气不好,你最终没有遇到分段错误。