C 關於動態記憶體分配管理的介紹

2021-09-26 15:17:43 字數 1951 閱讀 4452

1.為什麼存在動態記憶體分配?

常規的開闢記憶體方法:

int val = 20;//在棧空間上開闢了四個位元組

char arr[10] = ;//在棧空間上開闢了十個位元組的連續空間

但是上述開闢空間有兩個特點

空間開闢大小是固定的。

陣列在申明的時候,必須指定陣列的長度,它所需要的內存在編譯時分配。

但是對於空間的需求,不僅僅是上述的情況。有時候我們需要的空間大小在程式執行的時候才能知道,那陣列的編譯時候開闢空間的方式就不滿足了,這時候只能動態記憶體開闢.

動態記憶體函式

第一 malloc和free

void *malloc( size_t size )

malloc返回乙個指向分配空間的空指標,如果可用記憶體不足,則返回null。若要返回指向void以外型別的指標,請對返回值使用型別強制轉換。返回值所指向的儲存空間保證適當對齊,以便儲存任何型別的物件。如果size為0,malloc在堆中分配乙個零長度的項,並返回乙個指向該項的有效指標。始終檢查來自malloc的返回,即使請求的記憶體量很小。

注意malloc 必須和free成對使用,否則會出現記憶體洩漏的情況

**實現malloc

源**如下

#include #include int main()

else

for (i = 0; i < 10; i++)

}free(ptr);//釋放ptr所開闢的動態空間

ptr = null;

return 0;

}

c語言還提供了乙個函式叫 calloc , calloc 函式也用來動態記憶體分配。原型如下:

void* calloc (size_t num, size_t size);

函式的功能是為 num 個大小為 size 的元素開闢一塊空間,並且把空間的每個位元組初始化為0。

與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0。 舉個例子:

#include

#include

int main()

else

}free§;

p = null;

return 0;

}3.realloc函式

realloc函式的出現讓動態記憶體管理更加靈活。

有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體,我

們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。 函式原型如

下:void realloc (void ptr, size_t size);

ptr 是要調整的記憶體位址

size 調整之後新大小

返回值為調整之後的記憶體起始位置。

這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到 新 的空間。

realloc在調整記憶體空間的是存在兩種情況:

realloc返回乙個指向重新分配(可能已移動)記憶體塊的空指標。如果大小為零,緩衝區引數不為空,或者沒有足夠的可用記憶體將塊擴充套件到給定大小,則返回值為null。在第一種情況下,原始塊被釋放。在第二種情況下,原始塊沒有改變。返回值指向乙個儲存空間,該儲存空間保證對任何型別的物件的儲存進行適當對齊。若要獲得指向void以外型別的指標,請對返回值使用型別強制轉換。

源**如下

int main()

else

for (i = 0; i < 10; i++)

}int* p = null;

p = realloc(ptr, 10*sizeof(int));

if (*p == null)

else

for (i = 0; i < 20; i++)

}free(p);

p = null;

return 0;

}

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

關於動態記憶體分配

動態記憶體分配方式在很多場合下有著重要的意義。動態分配使得記憶體的利用效率大大提高,在一些記憶體受限的情況下顯得極為重要。但是動態分配會帶來乙個問題,如何釋放。這個問題的關鍵就是,在釋放的時候,如何獲知這塊需要釋放的記憶體空間是多少位元組的。在文中,筆者談到new malloc 等方式動態分配的記憶...

C語言記憶體管理 動態記憶體分配

一 介紹 一般定義陣列是要給固定的長度,當我們不知道輸入的長度是多少的時候,怎麼辦 例如 需求現在有乙個 本儲存,本中聯絡人並不知道有多少,一次定義1000個長度會占用記憶體,定義太小又會導致儲存不夠 c語音給了一種特殊的方式,動態記憶體分配 二 函式介紹 標頭檔案 include 1 void m...