本篇文章純屬娛樂,沒太多技術性的東西。只是我覺得還比較有意思,所以記一下!《大俠請繞道!
#include int main(int argc, char *argv)
printf("program is end!\n");
return 0;
}
很顯然,在本段**中,出現了乙個越界操作的問題。不過幸運的是,編譯還是通得過的。大家猜想結果是什麼呢?我原本以為會輸出如下字元:
arr[0] = 0
arr[1] = 0
arr[2] = 0
arr[3] = 0
arr[4] = 0
arr[5] = 0
arr[6] = 0
arr[7] = 0
arr[8] = 0
arr[9] = 0
arr[10] = 0
program is end!
不過,結果卻是這樣:
什麼意思呢?就是說"program is end!"根本沒列印出來,換句話說就是:程式進入了乙個死迴圈。
要是我換一種寫法:
#include int main(int argc, char *argv)
printf("program is end!\n");
return 0;
}
結果又是怎樣呢?
這次成功的列印出"program is end!"了。不過,系統卻彈出了這樣乙個提示視窗——arr.exe已停止工作。這是由於我們越界操作,導致程式崩潰了。這個好理解,納悶的是,同樣的**,為什麼結果卻出現這麼大的不同呢?
兩端**唯一的不同就在於迴圈變數i和陣列arr的定義先後順序不一樣,問題,也只可能出現在這裡。
原來,在vc++6.0編譯器中,按照記憶體位址遞減的方式來給變數分配記憶體
在越界訪問arr[10]的時候,實際上進行的操作時為變數i所在位置賦值為0,故,每次執行到i = 10的時候,i就被賦值為0,程式永遠出不來。成為了乙個死迴圈。
而在後一段**中,記憶體分配情況如下:
當執行到arr[10] = 0的時候,實際上是把上圖arr[9]左邊的一塊區域設定為0,與i無關,故程式能跳出迴圈。但這種訪問時非法的,故,程式會異常終止。
C語言中陣列越界導致死迴圈的測試
include 如何把這段 變成死迴圈,就像 c語言缺陷和陷阱 裡描述的那樣 經過測試發現,變數i的位址和a crazynum 的位址一樣,當執行 a crazynum 0 相當於i 0 所以死迴圈跑起來啦。測試環境 win7 32 dev c 4.9.9.2 c語言缺陷和陷阱 中的場景是編譯器按照...
C C 分析陣列越界訪問導致死迴圈
閱讀下面 並分析導致其結果的原因 以下分析基於vs環境的除錯 include include intmain 擁有10個元素的整型陣列 for i 0 i 12 i 迴圈13次,越界訪問 system pause return0 分析 整型陣列arr有10個元素,for迴圈13次,導致陣列越界訪問。...
陣列越界出現死迴圈問題
1 include 2 3int main 4 7for i 3 i 11return0 12 執行 是會陷入輸出hello world的死迴圈。原因是陣列越界,a 3 的位址指向了變數i的位址。這讓我疑惑,為什麼a 3 的位址指向變數i的位址?經過大佬的解釋 才理解。因為會進行8位元組對齊,i的位...