c 中記憶體的分類及堆和棧的區別

2021-06-22 13:54:04 字數 737 閱讀 9288

c++中經常操作的記憶體分為以下幾個類別:

1、棧區(stack):由編譯器自動分配和釋放,存放函式的引數值、區域性變數的值等等。其操作方式類似於資料結構中的棧;只要棧的剩餘空間大於申請空間,系統就為其提供記憶體,否則包異常提示棧溢位。在windows下棧是向低位址拓展的資料結構,是一塊連續的記憶體空間,棧頂的位址和棧的最大空間是系統預定好的。。

在函式呼叫時,第乙個進棧的是主函式的下一條指令,的位址,然後是函式的各個引數,在大多數的編譯器中,引數的傳遞是由右往左入棧,然後是函式中的區域性變數,注意靜態變數是不會進棧的。

2、堆區:一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束是可能由作業系統**,注意其與資料結構中的堆完全不是一回事兒,分配方式類似於鍊錶。作業系統有乙個記錄空閒記憶體位址的鍊錶,系統申請時會遍歷改鍊錶,尋找第乙個大於申請空間的堆節點。堆是向搞位址拓展的資料結構,是不連續的記憶體區域。鍊錶的遍歷方向是由低向高的,堆的大小受限於計算機的有效虛擬記憶體,堆獲取的空間比較靈活,也比較大。

3、全域性區(靜態區):全域性變數和靜態變數的儲存是放在一塊的,舒適化的全域性變數和靜態變數在一塊區域,為初始化的全域性變數和靜態變數在相鄰的另一塊區域。程式結束時有系統釋放。

4、文字常量區:常量字串就是放在這裡的,程式結束時由系統釋放。

5、程式**區:存放函式體的二進位制**。

eg:

int a=0;  //全域性初始化區

char *p; //全域性未初始化區

main()

C 中的棧記憶體和堆記憶體的區別

棧 是一種連續儲存的資料結構,具有先進後出的性質。通常的操作有入棧 圧棧 出棧和棧頂元素。想要讀取棧中的某個元素,就要將其之前的所有元素出棧才能完成。模擬現實中的箱子一樣。堆 是一種非連續的樹形儲存資料結構,每個節點有乙個值,整棵樹是經過排序的。特點是根結點的值最小 或最大 且根結點的兩個子樹也是乙...

記憶體中堆和棧的區別

原文 在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看...

記憶體堆和棧的區別

在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...