c 超出数组边界的值的问题

#include<stdio.h>

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

输出:
15,45,
10,145

输出的第二行 a[m]的值为什么是10? 这里m的值是10,a[10]是超出数组边界的啊

阅读 3k
3 个回答

编译器并不检查数组越界,运行时出现错误是操作系统检测到的异常。而操作系统只检测要访问的这段内存是否属于该程序,而不是数组越界。

如果精心的控制越界,并给这些位置赋值,就可以改变程序正在执行的代码!!!

数组越界的值是不确定的,内存中那一块的数据是多少就是多少;至于那一块内存是空闲的,还是被其他程序使用,还是储存其他数据,都是无法得知的。

关于代码的正确性和规范,楼上几位已经说了很多了,我再补充一点嵌套循环的时候最好不要使用相同的索引变量名,尽管他们不是同一个变量。

好了,开始说正题:为什么会是 a[10] 会是 10?
是因为 a[10] 实际上访问的是 f1 函数中的静态变量 n,因为 全局变量(初始化过的)和静态变量都会放在 .data 段(就是数据段),而 n 刚好在 a 数组后面,所以 a[10] 就访问到它了。n 最初为 3,经过7次自增之后就变成 10 了。可以在刚定义 n 之后 打印 a[10] 来验证这个问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进