記憶體中堆和棧的區別 面試知識點

2021-08-26 20:53:34 字數 625 閱讀 2946

(1)什麼是堆:堆是大家共有的空間,分全域性堆和區域性堆。全域性堆就是所有沒有分配的空間,區域性堆就是使用者分配的空間。

堆在作業系統對程序初始化的時候分配,執行過程中也可以向系統要額外的堆,但是記得用完了要還給作業系統,要不然就是記憶體洩漏。 

棧是由編譯器自動分配釋放,存放函式的引數值、區域性變數的值等。操作方式類似於資料結構中的棧。

堆一般由程式設計師分配釋放,若不釋放,程式結束時可能由os**。注意這裡說是可能,並非一定。所以我想再強調一次,記得要釋放! 

舉個例子,如果你在函式上面定義了乙個指標變數,然後在這個函式裡申請了一塊記憶體讓指標指向它。實際上,這個指標的位址是在棧上,但是它所指向的內容卻是在堆上面的!這一點要注意!所以,再想想,在乙個函式裡申請了空間後,比如說下面這個函式:

void function(void) 

就這個例子,千萬不要認為函式返回,函式所在的棧被銷毀指標也跟著銷毀,申請的記憶體也就一樣跟著銷毀了!這絕對是錯誤的!因為申請的內存在堆上,而函式所在的棧被銷毀跟堆完全沒有啥關係。所以,還是那句話:記得釋放! 

釋放:

free(p);

p=null;

注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

記憶體中堆和棧的區別

原文 在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看...

記憶體堆和棧的區別

在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...

記憶體堆和棧的區別

原文 在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看...