c语言全局变量数组越界问题


#include<stdio.h>
int m=10,n=5,a[10]={1,2,3};
void f1()
{
    static int n=3;
    a[n]=a[n-1]+a[n-2]+a[n-3];
    printf("an=%d ",a[n]);
    n++;
}
void f2(int m)
{
    for(;m<3;m+=2)
    {
        int m;
        for(m=1;m<4;m++)
            printf("%d ",a[m++]);
    }
}
void main()
{
    int i;
    for(i=0;i<7;i++) f1();
    f2(1);
    printf("\n%d,%d\n",m,n);
    printf("%d,%d\n",a[m],a[n]);
} 

为什么最后a[m]结果是10?最后m是全局变量,值m=10,数组a[10]下标最大应该是9,所以a[m]不是越界了么?

确实越界了啊。不过越界只要不修改内容,也不一定会死。

是越界了,但c语言中数组下标越界不会直接报错。只是访问数组分配空间之后的空间地址。
如果这个空间地址被其他变量所使用,就容易引起一些未知的错误

是越界了,但那个地址也被分配出去了,所以它是超出了数组范围但仍在分配给程序的内存空间内,你可以检查一下其他值的地址

img


请大家看一下运行结果,每次循环a[10]都加1,大不理解。