區分記憶體中的棧和堆與資料結構中的棧和堆

2021-08-21 15:27:57 字數 1227 閱讀 6662

首先要明確一點,這兩個東西是八竿子打不著的東西,他倆沒啥關係

資料結構中的棧和堆(堆疊)

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

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

棧就像彈夾,先裝進去的最後出來,filo(first in last out)。

堆像一棵倒過來的樹,堆是一種經過排序的樹形資料結構,每個結點都有乙個值。通常我們所說的堆的資料結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。

記憶體中的棧和堆

1.申請方式

stack(棧區):有系統自動分配。例如:在函式中宣告乙個區域性變數int b;系統將自動在棧區為b開闢記憶體空間,由系統釋放。

heap(堆區):需要程式設計師自己申請,並指明大小,由程式設計師自己釋放。

2.申請後系統的響應

棧:只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體,否則將報異常,棧溢位。

堆:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到申請時,會遍歷鍊錶,尋找第乙個空間大於所申請空間的堆節點,然後將該節點從空閒節點鍊錶中刪除,並將該節點的空間分配給程式,一般是在堆的頭部用乙個位元組存放堆的大小。由於找到的堆節點的大小不一定正好等於申請的大小,系統會自動將多餘的那部分重新放入空閒鍊錶中。

3.申請大小的限制

4.申請效率比較

棧:有系統自動分配,速度較快,但程式設計師無法控制。

堆:由malloc(),new()分配的記憶體,速度較慢,並且容易產生記憶體碎片。

5.訪問效率比較

char str1 = "aaa";

char *str2 = "bbb";

其中aaa是在執行時刻進行賦值的,存放在棧中,bbb是在編譯時就確定了,放在堆中,在以後的訪問中,陣列(堆區)快於(指標)棧區。

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

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

int main()

關於堆和棧區的比喻

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。比喻很形象,說的很通俗易懂。

資料結構 記憶體分配中的堆和棧

棧後進先出。堆堆是一種經過排序的樹形資料結構,每個結點都有乙個值。通常我們所說的堆的資料結構,是指二叉堆。堆的特點是根結點的值最小 或最大 且根結點的兩個子樹也是乙個堆。由於堆的這個特性,常用來實現優先佇列,堆的訪問是隨意,直接取出我們想要的結點。記憶體中的棧區處於相對較高的位址以位址的增長方向為上...

資料結構和記憶體中堆和棧的區別

特別宣告 本文參考了部落格 一 資料結構中的堆和棧 堆和棧在資料結構中是兩種不同的資料結構。兩者都是資料項按序排列的資料結構。棧 像是裝資料的桶或者箱子 棧是大家比較熟悉的一種資料結構,它是一種具有後進先出的資料結構,也就是說後存放的先取,先存放的後取,這就類似於我們要在取放在箱子底部的東西 放進去...

資料結構和記憶體中堆和棧的區別

特別宣告 本文參考了部落格 一 資料結構中的堆和棧 堆和棧在資料結構中是兩種不同的資料結構。兩者都是資料項按序排列的資料結構。棧 像是裝資料的桶或者箱子 棧是大家比較熟悉的一種資料結構,它是一種具有後進先出的資料結構,也就是說後存放的先取,先存放的後取,這就類似於我們要在取放在箱子底部的東西 放進去...