C動態記憶體開闢函式總結
阿新 • • 發佈:2019-01-26
malloc和free
void* malloc (size_t size);
malloc 函式向記憶體申請一塊連續的空間,並且返回指向這塊空間的地址。注意,malloc只負責動態開闢一段連續空間,並不負責這塊空間的初始化。
- 如果開闢成功,返回一個指向開闢好空間的地址。
- 如果開闢失敗,返回一個NULL指標,注意:malloc的返回值一定要走檢查。
- malloc函式並不知道要開闢多大的空間,具體大小的要自己決定。
- 如果引數size為0,malloc的行為是不確定的,取決於編譯器。
void free (void* ptr);
free函式是專門用來做動態開闢記憶體的釋放和回收。
- 如果引數ptr 指向的空間不是動態開闢的,則free函式的行為是不確定的。
- 如果引數ptr 是NULL,則函式什麼都不做。
int *arr[10] = { 0 };
int *p =(int*) malloc(sizeof(int)*10); //為指標p開40位元組的空間
if (p != NULL)
{
for (int i = 0; i < 10; i++)
{
*(p+i) = 2;
}
}
free(p);
p = NULL;
注意:
動態記憶體開闢的空間一定要free。如果不free的話會出現記憶體洩漏問題。
calloc
void* calloc (size_t num, size_t size);
calloc函式是為num個大小為size的元素開闢一塊空間,並且把空間的每個位元組初始化為0。這是與malloc函式的一大區別。
realloc
有時我們會發現過去申請的空間太小了,或者太大了,為了合理的記憶體,需在原來的記憶體上調整大小,而realloc函式就能夠解決這一問題。
void* realloc (void* ptr, size_t size);
- ptr是要調整的記憶體地址
- size是調整之後的新大小
- 返回值為調整之後的記憶體起始地址
- 這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料挪到新的空間。
用realloc函式共有2種情況:
原來空間之後有足夠大的空間,這時候要擴充套件的記憶體就直接在原有記憶體之後直接追加,原來空間的資料不發生變化。
原有記憶體之後沒有足夠大的空間,這時候在堆空間上另外找一塊合適大小的連續空間,將原來記憶體的資料也拷到新記憶體中,這樣函式返回一個新的記憶體地址。