C 堆 heap 和棧 stack 小記

2021-08-20 06:49:30 字數 1494 閱讀 2648

原文:

實際專案中,堆(heap)和棧(stack)很少親力親為去寫,對其的理解很朦朧,特記錄以加深對堆(heap)和棧(stack)的理解。要點:堆,先進先出(fifo—first in first out);棧,先進後出(filo—first-in/last-out)。

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

用棧儲存變數的好處是,記憶體是被你管理的。你不用手動的建立記憶體,不用當你不在需要它的時候手動釋放記憶體。另外,由於cpu組織棧記憶體很高效。讀出和寫入棧變數是很快的。

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

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

總結棧

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

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

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

堆也是我們的計算機記憶體中的乙個區域,但是他不是自動管理的。而且也不是被cpu密切的管理著。它是一片更加自由的記憶體區域(很大)。堆是fifo,要想在堆上建立記憶體,我們必須使用malloc( ) 或者calloc( ),他們都是c語言編譯的。一旦你在堆上分配記憶體,當你不在需要的時候你必須用free()去銷毀。如果你不銷毀或者銷毀失敗,你的程式就會有記憶體洩露。換句話說就是堆記憶體會一直在,其他程序無法使用。我們將會再除錯部分看到,那裡有乙個叫做valgrind的東西,它可以幫助你發現記憶體洩露。

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

我們應該什麼時候使用堆(heap)和棧(stack)呢?如果我們需要分配一大塊記憶體(例如乙個很大的陣列或者乙個很大的結構體),而且我們需要保持這個變數很長時間(例如全域性變數)。我們應該分配堆(heap)記憶體。如果你處理的很小的變數,而且只要再函式使用的時候存活,那麼你應該使用棧(stack),它比較方便而且快捷。如果你需要類似與陣列或者結構體的變數,而且能夠動態改變大小(例如乙個陣列可以根據需要新增資料或者刪除資料),那麼你可以用malloc(),realloc()給他們分配堆記憶體,用free()手動的管理記憶體。

後面再補充…

堆 heap 和棧 stack 轉

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

堆(Heap)和棧(Stack)的區別

五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...

堆(Heap)和棧(Stack 轉 整理

一 程式的記憶體分配 1 棧區 stack 由編譯器自動分配釋放 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性...