17 3 22 堆疊記憶體講解

2022-04-02 14:48:11 字數 1188 閱讀 2902

首先在資料結構上要知道堆疊,儘管我們這麼稱呼它,但實際上堆疊是兩種資料結構:堆和棧。

堆和棧都是一種資料項按序排列的資料結構。

棧就像裝資料的桶或箱子

我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的資料結構,也就是說後存放的先取,先存放的後取。

這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。

堆像一棵倒過來的樹

而堆就不同了,堆是一種經過排序的樹形資料結構,每個結點都有乙個值。

通常我們所說的堆的資料結構,是指二叉堆。

堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。

由於堆的這個特性,常用來實現優先佇列,堆的訪問是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。

然而我要說的重點並不在這,我要說的堆和棧並不是資料結構的堆和棧,之所以要說資料結構的堆和棧是為了和後面我要說的堆區和棧區區別開來,請大家一定要注意。

下面就說說c語言程式記憶體分配中的堆和棧,這裡有必要把記憶體分配也提一下,大家不要嫌我囉嗦,一般情況下程式存放在rom(唯讀記憶體,比如硬碟)或flash中,執行時需要拷到ram(隨機儲存器ram)中執行,ram會分別儲存不同的資訊,如下圖

所示:

記憶體中的棧區處於相對較高的位址以位址的增長方向為上的話,棧位址是向下增長的。

棧中分配區域性變數空間,堆區是向上增長的用於分配程式設計師申請的記憶體空間。另外還有靜態區是分配靜態變數,全域性變數空間的;唯讀區是分配常量和程式**空間的;以及其他一些分割槽。

1

int a = 0; //

全域性初始化區

2char *p1; //

全域性未初始化區

3main()

4

注意上面的加紅字:

1)當你的程式點  儲存   就會存到硬碟   這個和你將**存在哪乙個盤有關係

2)當程式一執行,那麼就會把程式載入到記憶體   ,記憶體中不是單單存你的**  而是關於**的所有資訊,詳細見那個圖

3)然後按照相應的順序  進行執行程式。

詳細的乙個鏈結

棧 堆和靜態區 記憶體的講解

對於程式設計師,一般來說,我們可以簡單的理解為記憶體分為三個部分 靜態區,棧,堆。很多書沒有把把堆和棧解釋清楚,導致初學者總是分不清楚。其實堆疊就是棧,而不是 堆。堆的英文是heap 棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性,這裡先不做討論。再打個比方 一層教學樓,可能有外語教室,允...

堆記憶體 棧記憶體

從堆和棧的功能和作用來通俗的比較,堆主要用來存放物件的,棧主要是用來執行程式的.而這種不同又主要是由於堆和棧的特點決定的 在程式設計中,例如c c 中,所有的方法呼叫都是通過棧來進行的,所有的區域性變數,形式引數都是從棧中分配記憶體空間的。實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳...

C 物件記憶體模型1(堆疊模型)

物件記憶體模型 一.棧 stack vs.堆 heap 堆 1.myclass c 10 棧物件,空間大小在編譯時確定,函式執行結束,系統立即 2.myclass func 3.myclass func 結論 指標指向棧物件,就要極度小心,一般會有問題!myclass func 總結返回指標問題 返...