一、 陣列越界問題
例子思考
int main()
return 0;
}
問題:當執行上述**時,會出現什麼問題?為什麼會這樣?
為解決以上問題,我們首先得明白當定義乙個函式時,函式中各個量的空間分配符合棧(後進先出)的原則,如果乙個量被先定義,那麼系統便先給它分配儲存空間。而在陣列中,0號下標位址值永遠小於1號下標位址值。因此,對於上述問題,我們可以畫出它的記憶體空間示意圖,分析執行**會出現什麼結果。具體圖如下所示:
根據上圖所示,程式從主函式開始往下執行,當int i;
時,系統首先為i分配四個位元組的空間,接著int arr[10];
時,定義了乙個長度為10的陣列,因為在陣列中,0號下標位址值永遠小於1號下標位址值,同時棧的定義就是棧底位址大。便可知到上圖(左)(圖中兩紅線之間表示為陣列所佔空間)便為定義後,i與陣列arr在記憶體中分配圖。接著執行:for(i=0;i<=10;i++)
。當i<10
時,陣列下標0-9分別對應的元素被賦值為0。i=10
時陣列滿溢,會發生越界情況。在陣列越界情況中,陣列會預設牽涉其鄰近元素,在此例子中即為i,因此當i=10
時,系統會將i所對應的值賦為0。 結論
此段**執行時會產生死迴圈。原因是:因為陣列越界,當i=10
時,系統將i所對應的值賦為0,此時i=0
且i<=10
系統又會進入新一輪迴圈。以此類推,系統陷入死迴圈。
解決辦法
i.編譯器:visual studio 2012針對於上述問題會產生崩潰現象,具體實現過程如上圖(右),vs12會在陣列arr與變數i中間進行隔離,避免陣列越界影響到i,同時在陣列arr與變數i中間申請兩個記憶體空間,分別放在兩顆「炸彈」,陣列一旦越界,觸碰到炸彈,系統中斷,提出警告。
ii.人力控制:牢記陣列最大下標值=陣列長度-1
,**仔細書寫,避免越界問題產生。
二、 指標初入門
概念介紹
符號& :表示取位址。//eg:&a表示取a 的位址。
符號* :可以表示乘法、定義乙個指標變數、對變數解引用。//eg: 34、intp(定義乙個指標變數p)、*p(對p解引用)
首先我們得知道指標==位址 ,通過以下介紹,我們來理解指標為什麼相當於位址。
例子思考
其中&a=1000,&b=2000,&p=3000,觀察此**,分析每一步都做了什麼!
int main()
對上段**,我們畫圖理解:
(1)定義乙個整形變數a,並將10賦值給它;
(2)定義乙個整形變數b,並將20賦值給它;
(3)定義乙個整形指標變數p儲存變數a的位址,此時執行上圖中的第(1) 步,p指向a;
(4)*p = 100;對p解一次引用,此時p指向a,即a=100;
(5)指標變數p儲存變數b的位址,此時執行上圖中的第(2) 步,p指向b;
(6)*p = 200;對p解一次引用,此時p指向b,即b=200;
(7)定義乙個整形二級指標變數pp儲存指標變數p的位址;
(8)對pp解一次引用,也就是執行上圖中的第(3) 步,pp指向p,此時p中儲存的是a的位址,即p=&a;
(9)對pp解兩次引用,也就是執行上圖中的第(3) 步,再執行第(1) 步,pp指向p,此時pp指向a的值, **pp = 1000,也就是將a的值置為1000;
(10)對pp解一次引用,也就是執行上圖中的第(3) 步,pp指向p,此時將b的位址賦值給p,p中儲存的是b的位址,即p=&b;
(11)對pp解兩次引用,也就是執行上圖中的第(3) 步,再執行第(2) 步,pp指向p,此時pp指向b的值, **pp = 2000,也就是將b的值置為2000;
因此,此**每一步都做了什麼展示如下:
int main()
陣列越界問題
c陣列越界問題 2010 07 23 22 23 include stdio.h define len 10 int main return 0 問題 為什麼輸入11個字元越界了都不會出錯?但是輸入13個字元卻出現錯誤?補充答案 在c語言中,很容易出現陣列越界問題。上面程式中定義了長度為10的int...
陣列越界問題
今天遇到了乙個問題 輸入一行文字,找出其中的大寫字母,小寫字母,空格,數字以及其他字元各有多少?要求用指標變數 我的答案 include void main int st char t,int o else if t n 97 t n 122 else if t n 48 t n 57 else i...
陣列越界問題
首先一點是明白陣列是有固定的大小的,然後是陣列的下標是從0開始到定義的陣列size 1。陣列越界常發生在非法索引訪問陣列,非法是指索引值為負值或大於等於陣列大小,這裡最常迷惑人的是大於等於陣列大小。首先,因為在往陣列中插入資料時,陣列此時的大小是等於陣列中資料長度的,並不是你之前的規定的值。那之前規...