記憶體中的堆和棧

2021-08-11 09:30:40 字數 1290 閱讀 4843

堆區,棧區,全域性區,文字常量區,程式**區

棧是你的電腦記憶體的乙個特別區域,它用來儲存被每乙個function

(包括mian()方法)建立的臨時變數。棧是filo,就是先進後出原則的結構體,它密切的被cpu管理和充分利用。每次function宣告乙個新的變數,它就會被「推」到棧中。然後每次乙個function退出時,所有關於這個函式中定義的變數都會被釋放(換句話說就是刪除)。一旦棧中的變數釋放,這塊區域就會變成可用的,提供給其他棧中的變數。

記憶體是被你管理的。你不用手動的建立記憶體,不用當你不在需要它的時候手動釋放記憶體。另外,由於cpu

組織棧記憶體很高效。讀出和寫入棧變數是很快的。

當乙個function

退出時,所有它的變數都會從棧中彈出,以後都會永遠消失。因此棧中的變數本質是區域性的。這和我們原來理解為變數作用域或者本地或者全域性變數是相關的。在c中,乙個公共的bug 是從你程式中的乙個function外嘗試訪問乙個在棧中的這個function的變數(在該function已經退出後)。

關於棧的另乙個特點我們應該記住,就是儲存在棧中的變數的大小有限制。而堆上建立變數不用考慮。

總結棧: a

、棧的伸長和伸縮就是函式壓入或者推出區域性變數。 b

、我們不用自己去管理記憶體,變數建立和釋放都是自動的。 c

、棧中的變數只有在函式建立執行時存在。

堆也是我們的計算機記憶體中的乙個區域,但是他不是自動管理的。而且也不是被cpu

密切的管理著。它是一片更加自由的記憶體區域(很大)。要想在堆上建立記憶體,我們必須使用malloc()或者calloc(),他們都是c語言編譯的。一旦你在堆上分配記憶體,當你不在需要的時候你必須用free()去銷毀。如果你不銷毀或者銷毀失敗,你的程式就會有記憶體洩露。換句話說就是堆記憶體會一直在,其他程序無法使用。

堆沒有變數大小的限制(除了你電腦的物理限制條件外)。堆記憶體讀出和寫入都比較慢,因為它必須使用指標圖訪問堆記憶體。

1)、快速訪問。 2)

、沒有必要明確的建立分類變數,因為它是自動管理的。 3)

、空間被cpu

高效地管理著,記憶體不會變成碎片。 4)

、只有區域性變數 5)

、受限於棧大小(

取決於作業系統) 6)

、變數不能調整大小。

1)、變數可以被全域性訪問 2)

、沒有記憶體大小限制 3)

、(相對)訪問比較慢 4)

、沒有高效地使用空間,隨著塊記憶體的建立和銷毀,記憶體可能會變成碎片。 5)

、你必須管理記憶體(變數的建立和銷毀你必須要負責) 6)

、變數大小可以用realloc( )

調整

記憶體中堆和棧

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

記憶體中的堆和棧

棧 棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是2m 也有的說是1m,總之是乙個編譯時就確定的常數 如果申請的空間超過棧的剩餘空間時,將 提示overflow。因此,能從棧獲得的空間較小。堆和棧的對...

記憶體中的堆和棧

一般情況下程式存放在rom或flash中,執行時需要拷到記憶體中執行,記憶體會分別儲存不同的資訊。1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 作...