1. 程式人生 > >Java學習筆記33:陣列下標越界

Java學習筆記33:陣列下標越界

陣列下標越界在引用陣列元素時,使用的下標超過了該陣列下標的應有範圍。

但應注意的是:
C/C++不對陣列做邊界檢查。 可以重寫陣列的每一端,並寫入一些其他變數的陣列或者甚至是寫入程式的程式碼。不檢查下標是否越界可以有效提高程式執行的效率,因為如果你檢查,那麼編譯器必須在生成的目的碼中加入額外的程式碼用於程式執行時檢測下標是否越界,這就會導致程式的執行速度下降,所以為了程式的執行效率,C / C++才不檢查下標是否越界。發現如果陣列下標越界了,那麼它會自動接著那塊記憶體往後寫。
關於C/C++為什麼不對陣列的下標是否越界做檢查,可以參考:
http://www.xuebuyuan.com/967089.html

因為編譯器不會自動檢測你的陣列下標是否越界,而是把這個任務交給了程式設計師自己,所以我們在寫程式,引用陣列元素時,一定注意不要讓陣列的下標越界。
還有,初學者一定不能忘了陣列的下標是從0開始的,不是常識中的從1開始。

記憶體溢位在初始化陣列(給陣列元素賦值)時,初始化(賦值)元素的個數超過了陣列定義時元素的個數。**

這裡的元素個數就是在定義陣列時那個方框框裡的數字,對於多維陣列來說,元素個數 = 每個方框框裡的數字之積。
當然,求陣列元素個數可以用公式:
陣列元素個數 = sizeof(陣列名)/sizeof(陣列任意一個元素)

為什麼會出現陣列下標越界?
C語言不檢查陣列下標的合法性

陣列下標越界的危害
陣列下標越界時,結果隨機。可能導致程式功能不正常,也可能導致程式崩潰。

如何防止陣列下標越界?
1、在使用迴圈遍歷陣列元素時,注意防範off-by-one的錯誤。

2、對於作為函式引數傳入的陣列下標,要判斷其合法性。if ( (pos < 0) || (pos > ARRAY_SIZE) ) {異常處理}