堆記憶體和棧記憶體的管理

2022-08-22 05:21:15 字數 893 閱讀 3999

1、堆記憶體

堆記憶體是由程式設計師手工管理的,但它的申請是需要借助標準庫函式。在大小上,理論上是物理記憶體的大小。關於堆記憶體的資料儲存是靠程式設計師來管理的。由於是由程式設計師管理的,程式設計師的錯誤操作也導致記憶體的洩露和記憶體碎片的問題。

關於堆記憶體的標準庫函式(stdlib.h/malloc.h)

void* malloc(size_t size);

//size是以位元組為單位

//返回值是所申請到的記憶體的首位址

//void* 不能直接使用,需要轉換成其他有意義的才能使用。

//在大多數情況下void*可以自轉換成任意型別,但在個別情況下需要使用強制型別轉換

//malloc函式申請的記憶體,內容其實是隨機的,需要通過那個bzero函式來將它清理為0;

void bzero(void* s,size_t n);

//功能是把記憶體清理為0,以位元組為單位

//s是記憶體首位址,n位元組數 

void* calloc(size_t nmemb,size_t size);

//size是所申請記憶體的位元組數,nmemb是申請多次size,所申請到的記憶體內容已經被清理為0;

void* realloc(void* ptr,size_t size);

//調整已經有記憶體的大小,可把記憶體調大或調小。

//ptr是已有的記憶體首位址,size是調整後的大小。

//返回值是調整後的記憶體首位址

void free(void* ptr);

ptr =null;

//負責釋放記憶體,釋放後記得把指標置空。

2、棧記憶體

棧記憶體是由作業系統自己管理的,所以記憶體的申請和釋放都是自動的。同時它的大小也是有限的,裡面存放的資料也不能長久。因為是作業系統自己管理的,所以也基本不可能出現記憶體管理上的錯誤。

堆記憶體和棧記憶體

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

堆記憶體和棧記憶體

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

棧記憶體和堆記憶體

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