天天看點

for循環 數組下标越界導緻死循環

for循環 數組下标越界導緻死循環

如圖所示函數,最終for語句會陷入死循環,無法結束。

原因在于:堆棧幀中 a[0]~ a[4] 之後是 i  而 通路a[5]時,其位址也是 i所在的位址

是以當你給a[5]指派為0的時候,也就給 i 指派為  0 了。

這個問題的原因就是C在編譯的時候,不會對數組下标溢出做檢查。

是以以後用類似這樣的語句時,一定要注意控制數組下标,不要溢出了。

-----------------------------------------------------------

其彙編代碼如下:

for循環 數組下标越界導緻死循環

·······

······

····

···

··

·

然而并不能看懂。

------------------------------------------------------

是以用printf函數顯示每個變量所在的記憶體位址

for循環 數組下标越界導緻死循環

然後執行

結果如下:

for循環 數組下标越界導緻死循環

每個變量的位址都列印出來,能看出,i的位址确實與a[4] + 4 (即a[5])重複了

-----------------------------------------------------------------------------

【總結】

一開始定義a[5]的時候,記憶體中為數組a開辟了5個記憶體空間,

第六個放的是i,位址和a[5](假如有a[5])的話 重複了

是以a[5] = 0 這句表達式 等價于 i = 0;

是以陷入死循環。

-----------------------------------------------------------------

【繼續深入】

但是如果修改一下一開始變量定義的順序

for循環 數組下标越界導緻死循環

那麼出來的結果為:

for循環 數組下标越界導緻死循環

不過要注意,通路了沒有定義的數組元素a[5] 

這樣的代碼肯定是有問題的,隻不過輸出顯示暫時是正常的了。

或者,再定義幾個無關變量,

for循環 數組下标越界導緻死循環

結果為

for循環 數組下标越界導緻死循環

将那幾個無關變量的位址列印出來

這時候會發現 變量 apple 的位址與 a[5](如果有的話) 重了。

而函數中定義apple的位置恰好在定義a[5]的語句的上面。

繼續閱讀