C 陣列越界,陣列進棧

2021-08-29 04:03:14 字數 1169 閱讀 6601

首先,展示一段最常見的陣列越界。

先定義int型的變數i,再定義整型陣列,長度為10,然後for迴圈時,給i初始化,即i=0,判斷i<=10若為真,則給陣列中的所有值賦值為0,然後依次輸出i的變化;否則,迴圈結束。

**如下:

#include int main ()

}

結果如下圖:

編譯器(visual studio 2012)報錯!

原因:陣列長度為10,但是陣列編號是從0開始到9,共10個位置,編譯器預設i == 10在9後面,從而將10也列印出來。即下圖為陣列在棧中的存放:

接下來,解釋為什麼,在棧中這樣存放陣列,以及定義的變數。棧的存放,與先後定義變數有關,先定義的變數a,應該先由棧頂進入棧底,依次進入棧,陣列arr[2],其中包括arr[0],以及arr[1],在棧中,棧頂位址小,而棧底位址大,對於位址來說,arr[0]

**如下:

#include int main ()

兩種變數以及陣列進棧的方式如下圖:

上述**,編譯結果如下:

**輸出結果為變數a,b,c,以及陣列的的位址。a的位址後三位為964,b的位址後三位為952,c的位址後三位為940,arr[0]的位址後三位為924,arr[1]的位址後三位為928。變數a與變數b,本身都為int型,即4個位元組,但964 - 952=12,是因為編譯器為防止越界,加了兩個位,即8個位元組,而陣列與陣列之間是正常的4個位元組,比如arr[1] - arr[0] : 928 - 924=4。同樣的道理,為防止陣列越界,陣列與變數之間也加了兩個位,即c - arr[1] : 940 - 928=12。12為本身4個位元組以及兩個位的位元組。

棧與陣列越界

棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰...

c 陣列越界相關

標籤 空格分隔 問題少年系列 今天同學問我乙個很細節的問題,覺得提問那個人提不錯的 include stdafx.h include using namespace std int main cout cout return 0 我也很疑惑,所以查了一下 棧是由高往低增長的,而陣列的儲存是由低位往高...

C陣列下標越界

之前總聽說c語言的各種毛病,今天算是遇到乙個 陣列下標越界 兩段完成不相干的 一段是測溫度的,一段是測轉速的。兩段 單獨執行都沒有問題,但是若執行測轉速的 測溫度的資料就會發生錯誤。一步檢視,發現執行測轉速之後,測溫度的 中的乙個變數和乙個資料的值就會發生詭異的錯誤 陣列下標越界 這個越界非常不明顯...