堆分配 棧分配

2021-08-25 02:14:09 字數 526 閱讀 5690

棧的分配是編譯時刻決定的,所以用棧只能申請固定大小的記憶體,比如靜態陣列或者結構體。

函式中的區域性變數是用棧來實現的,函式結束後,棧頂的部分資料被破壞。

棧空間的大小可以在編譯前制定,vc中預設值為4m.函式每次呼叫,都會使用棧空間,故函式呼叫的層次太深,函式同時指定的陣列總容量太大。或者遞迴程式 呼叫層次太多,棧指標可能小於0(按無符號數理解為4l列小於0xffffffff,這樣會造成棧迴繞,程式崩潰。

堆的分配是作業系統的api函式實現的,c語言中 常使用malloc,c++中使用 new,堆方式的記憶體塊可以為任意大小,甚至超過物理記憶體,但是也不能太大。堆分配的記憶體必須顯式釋放,換言之,new /delete ,malloc/free必須配使用,在windows 作業系統,當退出應用程式是,堆中的記憶體會自動釋放。如果用堆分配記憶體,卻沒有釋放,甚至繼續分配記憶體,則會造成記憶體洩漏,記憶體越用越少,系統越來越慢。

上面都說得比較清楚了

一般的:函式與其內部的變數都是棧分配

全域性變數是堆分配

靜態變數不管在那裡都採用堆分配

記憶體的堆分配和棧分配

記憶體的堆分配和棧分配 備註 這一部分非常重要,如果錯誤請及時告知。謝謝 這裡是完全參考其他部落格。c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中的棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構...

記憶體的堆分配和棧分配

c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的存放區域。...

堆 head 棧 stack 記憶體分配

簡單的可以理解為 堆 heap 是由malloc之類函式分配的空間所在地。位址是由低向高增長的。棧 stack 是自動分配變數,以及函式呼叫的時候所使用的一些空間。位址是由高向低減少的。預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自...