-
1. 什麼是陣列越界訪問?
我們使用陣列的下標來獲取陣列中指定索引的元素。 這稱為對陣列的訪問。
如果將陣列定義為具有 n 個元素,則對於這 n 個元素(下標為 0 到 。
n-1 個元素)是合法的,如果超出這些 n 個元素的訪問是非法的,則稱為“越界”。
陣列占用連續的記憶體空間。 然後,我們可以通過指定陣列下標來訪問此記憶體中的不同位置。 因此,當下標太大時,存取記憶體不再是陣列“部分”中的記憶體。
您將訪問其他變數的記憶體。
2. 如果訪問越過邊境會怎樣?
首先,它不會導致編譯錯誤! 也就是說,C、C++ 編譯器不會判斷並指出你的**“訪問越界”。 顯然是乙個錯誤的東西像這樣“順利”地通過了編譯。
陣列訪問在執行時是越界的,它的行為不確定,有時似乎什麼都沒發生,程式一直在執行(當然,造成了一些錯誤結果); 有時,它只是程式一下子崩潰了。 因此,在使用陣列時,需要判斷它是否在程式設計中越界,以保證程式的正確性。
乙個常見的錯誤是陣列的大小值和下標訪問值錯誤,下表的陣列從0開始,最大訪問值為size-1。
3. 解決方案。
由於陣列的元素數預設沒有作為引數的內容傳遞到呼叫函式中,因此會帶來陣列訪問越界的問題,可以通過傳遞陣列的元素數來解決,即用兩個引數, 乙個是陣列的名稱,另乙個是陣列的長度。
示例:包括
void putarray(int *p, int length)
void main()
printf("陣列 a[3] 呼叫函式 putarray 的結果是:");
putarray(a,sizeof(a)/sizeof(a[0]))
-
不要使用超過陣列 -1 長度的下標。
-
1.不太可能所有陣列都會定位越界,因為陣列越界的結果可能是正確的,也可能是錯誤的,在處理陣列時可能是錯誤的,更有可能是在與其他陣列和越界資料的重疊區域會出錯, 而程式設計師只能仔細檢視資料的下標訪問號。
-
如果你不越過界線,你就不會崩潰。
-
會很危險,會不會是巧合,編譯器在除錯下會做什麼,試試發布,畢竟專案都是通過發布發布的。
-
1 您斷定您只在一台計算機上的特定環境中進行了測試,並不意味著您已經重新測試,或者您已經在另一台計算機上進行了測試。
2 正確的結論是,陣列元素(包括越界元素)的值在初始化之前是不確定的。 請更改時間並測試計算機。
-
記憶體分配給 num 的儲存位置緊接在陣列 a 之後,printf(“%d”, a[num]) 時輸出陣列 a 後面的位址內容,即 num 的值,該值是唯讀的,無法修改。
-
不,其他變數越界後的記憶體空間(不一定是程式)值是不確定的。
-
這樣不好,如上文提到的,不同的編譯器可能會初始化不同的值,即使以這種方式初始化,也有可能在這個地方定義了其他陣列或變數,這樣值就會出錯。 您可以考慮使用 for 迴圈來定義它,如果陣列的大小未知,則應使用動態 maloc 和 caloc 定義。
-
越界陣列的值不確定,在 Win7 下執行的 VS2008 編譯如下**包括
int a[10];
void main()
前 3 行輸出 0
第 4 行是錯誤,程式被強制關閉。
-
for(int i=0;i<10;i++)
程式一般是這樣寫的,0正好是陣列的第乙個元素,10正好是陣列的最後乙個元素加上1。
陣列的使用不能交叉,如果定義 10,則只能使用 0 9。 如果你這樣使用它,當堆疊中有新的陣列分配時,它會破壞你正在使用的空間,如果你能在它上面成功,你會得到這個,因為你使用的陣列。
-
外迴圈確定錯誤的範圍,最後乙個迴圈陣列越界需要 1
for(int i=0;i<;i++)
-
難道不應該將 arr[i] 與 if 中的 arr[j] 進行比較嗎?
-
冒泡演算法是這種情況嗎?
如果你這樣寫,當 i= 時,就有問題了。 建議看看冒泡演算法的比較情況。
-
大多數錯誤應該不會有很多重啟,很多人在開始程式設計時都有陣列越界的問題,所以他們不會重啟。
有很多方法:
1.最直接的方法是安裝VMware Tools,重啟虛擬抖動模擬器,直接實現虛擬機器和主機之間的拖拽檔案寬度。 >>>More