關於棧和堆

2021-10-05 11:10:34 字數 691 閱讀 9236

棧區:由程式自動向作業系統申請分配以及**,存放函式的引數、區域性變數,當函式呼叫結束時,釋放記憶體。速度快,使用方便。

堆區:程式設計師向作業系統申請一塊記憶體,分配速度慢、位址不連續容易碎片化但高度自由。既然是程式設計師申請的,當然是要由程式設計師來銷毀,畢竟做事要有始有終,懂得善後嘛,o(∩_∩)o哈哈~

(注:作業系統有乙個記錄空閒空間位址的鍊錶,當系統收到申請時,會遍歷乙個記錄空閒記憶體位址的鍊錶,尋找第乙個空間大於所申請空間的堆結點,將該結點從空間結點鍊錶中刪除,並將該結點分配給程式)

int a =0;

// 全域性變數

int c;

//全域性未初始化變數

intsky()

intmain()

輸出結果為:

100

2 10

很明顯,對於全域性變數a而言,a++每次變化都是接著上次變化進行的,即直到main函式執行完,它才會釋放記憶體;而區域性變數b,不管在區域性如何變化,呼叫它的函式結束,該變數的記憶體也就沒了,不能再其它函式中輸出該變數,不然程式報錯了;這兩者都是棧區的記憶體,申請釋放都是自動完成的,而對p來說,它是主動申請的堆區,就得自己申請自己釋放了。

關於堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

關於堆和棧

網上找到的,有什麼不對的大家指出來,重新學習 1.棧是存放函式返回位址 引數 區域性變數的。堆是程式可以自由操作的記憶體,使用時先申請,用完之後釋放,如何使用完全由程式 控制。2.棧在彙編 中表示成push pop,用的是ess段,sp暫存器 而堆不是,是在記憶體中讀寫,eds段,3.c 包括兩種被...

關於 棧 和 堆

棧區 stack 由編譯器自動分配和釋放,申請速度快,但程式設計師無法控制。主要存放函式的引數值 區域性變數等。棧頂位址小於棧的基位址。堆區 heap 由程式設計師分配和釋放,由new和malloc申請,delete和free釋放,分配的記憶體區不一定是連續的,類似鍊錶。若程式設計師不釋放,程式結束...