棧和堆的理解

2021-09-26 23:24:21 字數 1419 閱讀 5418

一、資料結構中的堆和棧

堆和棧在資料結構中是兩種不同的資料結構。 兩者都是資料項按序排列的資料結構。

棧:像是裝資料的桶或者箱子

棧是大家比較熟悉的一種資料結構,它是一種具有後進先出的資料結構,也就是說後存放的先取,先存放的後取,這就類似於我們要在取放在箱子底部的東西(放進去比較早的物體),我們首先要移開壓在它上面的物體(放入比較晚的物體)。

堆:像是一顆倒立的大樹

堆是一種經過排序的樹形資料結構,每個節點都有乙個值。通常我們所說的堆的資料結構是指二叉樹。堆的特點是根節點的值最小(或最大),且根節點的兩個樹也是乙個堆。由於堆的這個特性,常用來實現優先佇列,堆的訪問是隨意的,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。

二、記憶體分配中的堆和棧

我們現在經常用的並不是資料結構中的堆和棧,之所以說了資料結構中的堆和棧是為了和後面將要說的堆區和棧區區別開來,請大家一定要注意。

下面說一下c語言程式記憶體分配中的堆和棧,這裡有必要把記憶體分配也提一下,大家不要嫌棄本姑娘蘿莉囉嗦啦,一般情況下 程式存放在rom或flash中,執行事需要拷貝到記憶體中執行,記憶體會分別儲存不同的資訊。

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

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

來看乙個很經典的例子:

main.cpp

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

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

main ()

int b; 棧

char s = 「abc」;棧

char *p2; 棧

char *p3 = 「123456」; 123456\0 在常量區,p3 在棧區

static int c = 0; 全域性(靜態)初始化區

p1 = (char *)malloc(10);堆

p2 = (char *)malloc (20);堆

三 、 記憶體分配中棧區和堆區的區別

0、申請方式和**方式不同

不知道你是否有點明白了,堆和棧的第乙個區別就是申請方式的不同:棧(英文名字;stack)是系統自動分配空間的
,例如我們定義了乙個 char a ;系統會自動的在棧上為其開闢空間。而堆(英文名字:heap)則是程式設計師根據需要自己申請的空間,例如malloc(10); 開闢是個位元組的空間。由於棧上的空間是自動分配自動**的,所以棧上的資料的生存週期只是在函式的執行過程中,執行後就釋放掉,不可以再訪問。而堆上的資料只要程式設計師不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成記憶體洩露。

堆和棧的理解

利用markdown建立 1 c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 是自由儲存區,存放動態資料,像new,malloc 申請的空間就是堆區的,一般由程式設計師...

iOS 對堆和棧的理解

堆 和 棧的 區別 經典 此 文章雖然是 面向 c c 程式設計師寫得,但是對咱們 ios程式設計師還是很有幫助的。堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由 c c 編譯的程式佔 用的記憶體分為以下 幾個部分 1 棧區 stack 由編譯器 自動分配釋放 存放函式的引數值,區域性變數的值...

堆和棧的深入詳細理解

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...