C語言記憶體分配

2022-10-10 17:30:09 字數 1511 閱讀 2960

在程式的執行期間分配記憶體時,記憶體區域中的這個空間稱為堆(heap)。還有另乙個記憶體區域,稱為棧(stack),其中的空間分配給函式的引數和本地變數。在執行完該函式後,儲存引數和本地變數的記憶體空間就會釋放。堆中的記憶體是由程式設計師控制的。在分配堆上的記憶體時,由程式設計師跟蹤所分配的記憶體何時不再需要,並釋放這些空間,以便於以後重用它們。

使用動態記憶體很明顯的好處就是:不需要預先分配儲存空間且分配的空間可以根據程式的需要擴大或縮小,這樣可以有效的使用記憶體空間。

malloc和free

c函式庫中的malloc和free分別用於執行動態記憶體分配和釋放。這兩個函式的原型如下所示,他們都在標頭檔案stdlib.h中宣告。

void *malloc ( size_t size );

void free ( void *pointer );

malloc的作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回乙個null指標。所以在呼叫該函式時應該檢測返回值是否為null,確保非空之後再使用非常重要。malloc所分配的記憶體是一塊連續的空間。同時,malloc實際分配的記憶體空間可能會比你請求的多一點,但是這個行為只是由編譯器定義的。malloc不知道使用者所請求的記憶體需要儲存的資料型別,所以malloc返回乙個void *的指標,它可以轉換為其它任何型別的指標。

由於記憶體區域總是有限的,不能不限制地分配下去,而且乙個程式要盡量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。free的引數必須要麼是null,要麼是從malloc、relloc、calloc返回的值。作用是釋放之前返回的指標指向的記憶體空間,向free傳遞乙個null引數不會產生任何效果。

calloc和realloc與malloc的區別

calloc和realloc的原型如下:

void *calloc ( size_t num_elements, size_t element_size );

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

calloc和malloc 主要的區別在於前者在返回記憶體的指標之前將它初始化為0,另外它們請求數量的方式不同。calloc的引數包括所需元素的數量和每個元素的位元組,根據這些值可以計算出總共需要分配的記憶體空間。

realloc函式用於修改乙個原先已經分配的記憶體塊的大小,可以使一塊記憶體的擴大或縮小。當起始空間的位址為空,即*ptr = null,則同malloc。當*ptr非空:若nuw_size < size,即縮小*ptr所指向的記憶體空間,該記憶體塊尾部的部分記憶體被拿掉,剩餘部分記憶體的原先內容依然保留;若nuw_size > size,即擴大*ptr所指向的記憶體空間,如果原先的記憶體尾部有足夠的擴大空間,則直接在原先的記憶體塊尾部新增記憶體,如果原先的記憶體尾部空間不足,或原先的記憶體塊無法改變大小,realloc將重新分配另一塊nuw_size大小的記憶體,並把原先那塊記憶體的內容複製到新的記憶體塊上。因此,使用realloc後就應該改用realloc返回的新指標。

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...