
如圖所示函數,最終for語句會陷入死循環,無法結束。
原因在于:堆棧幀中 a[0]~ a[4] 之後是 i 而 通路a[5]時,其位址也是 i所在的位址
是以當你給a[5]指派為0的時候,也就給 i 指派為 0 了。
這個問題的原因就是C在編譯的時候,不會對數組下标溢出做檢查。
是以以後用類似這樣的語句時,一定要注意控制數組下标,不要溢出了。
-----------------------------------------------------------
其彙編代碼如下:
·······
······
····
···
··
·
然而并不能看懂。
------------------------------------------------------
是以用printf函數顯示每個變量所在的記憶體位址
然後執行
結果如下:
每個變量的位址都列印出來,能看出,i的位址确實與a[4] + 4 (即a[5])重複了
-----------------------------------------------------------------------------
【總結】
一開始定義a[5]的時候,記憶體中為數組a開辟了5個記憶體空間,
第六個放的是i,位址和a[5](假如有a[5])的話 重複了
是以a[5] = 0 這句表達式 等價于 i = 0;
是以陷入死循環。
-----------------------------------------------------------------
【繼續深入】
但是如果修改一下一開始變量定義的順序
那麼出來的結果為:
不過要注意,通路了沒有定義的數組元素a[5]
這樣的代碼肯定是有問題的,隻不過輸出顯示暫時是正常的了。
或者,再定義幾個無關變量,
結果為
将那幾個無關變量的位址列印出來
這時候會發現 變量 apple 的位址與 a[5](如果有的話) 重了。
而函數中定義apple的位置恰好在定義a[5]的語句的上面。