C語言陣列之記錄乙個陣列越界引發不可預料的BUG

2021-10-08 07:10:23 字數 936 閱讀 2885

#include

using

namespace std;

intmain()

;//未初始化的部分值為0

int brr[5]

;//陣列中的值為無效值

int crr=

;//陣列個數可以從右往左推導

//int len = 10;

//int drr[len]; windows不可,c99標準是允許的 linux可以

//陣列越界

int i;

int drr[10]

=;for(i =

0; i <=10;

++i)

return0;

}

上面**在不同的編譯器上可能會引起不同的後果,主要是以下兩點:在一些比較老的編譯器上,由於區域性變數入棧後,相鄰兩個變數之間是挨著的,如果陣列出現越界,就會將相鄰的變數的值修改掉,造成意想不到的後果;

在一些新的編譯器,兩個連續入棧的區域性變數,在棧上的空間不是連續的,比如int a,b,c,a和b之間記憶體不相鄰,b和c之間也不相鄰,他們之間被其他資料間隔開來,使得我們不容易去修改相鄰變數的值。

這張圖描繪的是相鄰變數之間沒有特殊間隔的情況,你可以按照迴圈一次往下走,當i == 10時,會將arr[10] 置為0,也就是將i 的值又從10置為了0,導致迴圈無法退出,出現死迴圈或者崩潰。

當然現代編譯器可能不會將兩個相鄰的變數直接記憶體相鄰,他會在兩個變數之間搞個間隔,不過,我們也可以跳過這層資料,試著當i == 10,給i 加乙個值試試。

這是在整理以前在大學的學習筆記上時看到的乙個問題,感覺挺有意思就記錄下來,希望各位讀者能得到一些啟發。

最近遇到的乙個陣列越界的BUG

關於二維陣列的問題,之前在我 中有如下這樣一段,cmd ds 1234567890abcd 1234567890 5 0016 44 ble a im 20 73 6a 18 ec e8,11 22 33 44 55 66 當解析到 e8,11 時會導致 dest 越界,但是由於我每次 cmd li...

c 返回乙個陣列

bqg s complexity analysis 最近遇到乙個很不一般的事情,返回乙個陣列時,我們可以直接返回它的首位址,但是如果呼叫兩次以上,返回的數值就是有問題的了。呼叫兩次js 函式,分別用a b陣列存放返回的陣列值,但是接收到返回的數值居然和我返回前存放的數值不一樣。及改善 include...

c 輸出乙個陣列

關於c 輸出乙個陣列最普遍的方法就是用for 迴圈語句寫 如 int a new int 10 for int i 0 i a.length i for int j 0 j 今天我在瀏覽stackoverflow的時候發現了兩個簡便的輸出陣列的語句 鏈結如下 乙個是 foreach var item...