java与C的混淆--个人经验

12年前
今天碰到的一个问题:(在群里面交流后解决了)
在C里面的一个程序是这样的:
int  main(int argc,char *argv[]){
    int i=0,a[9];
    for(;i<10;i++){
        a[i]=0;
    }
}
这样一个小程序会在C里会出现什么问题?
在群里进行了交流,超斗说是下标越界问题,我认为是死循环。
首先我的分析是自认为for 循环定义的变量只能在循环体内生效,出了{}无效。(//这句话是对的,但是我的理解错了)
我以为for循环的变量可以再外面声明,也对外面的变量无影响,所以i一直=0。(因为我电脑现在系统里没有C,C++,所以没验证)
 
我把这个程序移植在java中,首先是下面这个程序:
public class text {
 
 public static void main(String args[]) {
  int i =0;
  int []b1={0,1,2,3,4,5,6,7,8,};
  for(;i<10;i++){
   b1[i]=0;
  }
  System.out.println(i);
 }
}
调试结果:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
 at text.main(text.java:9)
很明显数组下标越界。
在看一下i的输出,程序改动一下,看下面程序:
public class text {
 
 public static void main(String args[]) {
  int i =0;
  int []b1={0,1,2,3,4,5,6,7,8,9};
  for(;i<10;i++){
   b1[i]=0;
  }
  System.out.println(i);
 }
}
调试结果:10
i的值为10,证明不是死循环。(但真的不是死循环吗?)
后面要证明,就得必须到C,C++ 上运行下,在朋友的机子上运行,结果却是死循环。
为什么呢?
C,C++虽然没有下标越界,但是会出现内存排列问题,
int i = 0;在内存里面占高位 a[8]其次
内存里面依次存放的是i,a[8]…………a[0]
所以a[9]的位置会占用i的位置,导致于a[9]=0;替代了i=10;使得i=0;所以产生死循环。
 
第一次写关于编程的经验,希望对学习java或C,C++的朋友有所帮助。