java與C的混淆--個人經驗

yuanbin 12年前發布 | 1K 次閱讀 云計算 IntelliJ IDEA viewport Evince
今天碰到的一個問題:(在群里面交流后解決了)
在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++的朋友有所幫助。
 本文由用戶 yuanbin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!