棧記憶體和堆記憶體

2021-09-10 16:41:10 字數 1113 閱讀 5946

####* 棧記憶體:由程式自動向作業系統申請分配以及**,程式啟動時統一分配此後不能再擴大,決定了遞迴深度有上限,但是c/c++一般情況下遞迴上萬次是可以的速度快,使用方便,但程式設計師無法控制。若分配失敗,則提示棧溢位錯誤。棧區向位址減小的方向增長,const區域性變數也儲存在棧區內,主調函式所擁有的區域性變數等資訊存在堆疊中

//測試棧記憶體

#include int main()

測試輸出為:

&i3 < &i2 < &i,證明位址是減小的。

//測試堆記憶體和棧記憶體的區別

#include int main()

測試輸出為:

執行多次後會發現pi所指向的位址並不連續,是跳躍式的;而&si是一致的,儲存在可讀寫區;前三個變數都儲存在棧區,由程式自動分配和銷毀。

小心記憶體洩漏

1)配對使用,有乙個malloc,就應該有乙個free。(c++中對應為new和delete)

2) 盡量在同一層上使用,不要malloc在函式中,而free在函式外。最好在同一呼叫層上使用這兩個函式。

3) malloc分配的記憶體一定要初始化。free後的指標一定要設定為null。

關於堆和棧區別的比喻:

堆和棧的區別可以引用一位前輩的比喻來看出:

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

[1]:

[2]:

[3]:

堆記憶體和棧記憶體

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

堆記憶體和棧記憶體

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

棧記憶體和堆記憶體

在平時寫 的時候經常遇到一些很簡單但是自己卻不太理解的問題,於是整理了一下。記憶體 一般情況下我們分為棧記憶體和堆記憶體。下面我們來說說它們的區別。一 棧記憶體 用於儲存區域性變數,當資料用完的時候,它所占用的空間會自動釋放。public class demo1 return j i 這裡的 i j...