C語言中陣列越界訪問造成死迴圈現象

2021-06-19 18:46:26 字數 1430 閱讀 3315

本篇文章純屬娛樂,沒太多技術性的東西。只是我覺得還比較有意思,所以記一下!《大俠請繞道!

#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的位...