1. 程式人生 > >C語言動態記憶體分配

C語言動態記憶體分配

malloc()函式:分配記憶體,需要一個引數,所需記憶體位元組數,返回分配的記憶體第一個位元組的地址。ANSI C標準(以前標準返回一個char指標)使用了指向void的“通用指標”來作為malloc()函式返回的指標的型別,在賦值的時候,需要把返回的void的“通用指標”指派為適當的型別。如果malloc()函式無法獲得所需的數量的記憶體,將返回空指標(NULL)。

//void *malloc(size_t size) 函式原型
double * ptd;
ptd = (double *)malloc(n*sizeof(double); //分配n個double型別所需的記憶體賦給ptd指標,然後就可以用ptd[i]來來訪問記憶體的元素

calloc()函式:與malloc()函式類似,但是接受兩個引數,都是無符號的整數。

//void *calloc(size_t nobj, size_t size) 函式原型
double * ptd;
ptd = (double *)calloc(n, sizeof(double)); //分配n個double型別所需的記憶體賦給ptd指標

realloc()函式:可以增加、減少以前分配記憶體長度,當我們在用realloc()函式進行擴充記憶體空間的時候,如果該儲存區後有足夠的空間可以擴充,就可在源儲存區位置上向高地址位方向直接擴充,如果沒有足夠的空餘空間可以擴充,則realloc()函式將會建立另外一個大的記憶體空間來分配,然後釋放原來空間儲存區指標,返回新分配去的指標。注意

:realloc()函式的最後一個從那時是儲存區的newsize(新長度),不是新、舊儲存區長度之差。

<span style="color:#000000;">//void *realloc(void *ptr, size_t newsize) 函式原型
double * ptd, *ptd1;
ptd = (double *)calloc(n, sizeof(double));
ptd1 = (double *)realloc(ptd, newsize); </span>

free()函式:釋放malloc()函式、calloc()函式和realloc()函式分配的記憶體,只釋放它的引數所指向的記憶體塊。通常情況下,程式終止後所有已分配的記憶體都會被自動釋放,如果在程式執行過程中,用malloc()函式分配的記憶體,不用free()函式去釋放,程式很可能會佔用很多記憶體,導致記憶體溢位(記憶體洩露)。

free(ptd); //釋放上面用malloc()函式分配的記憶體
FYI:上面四個關於記憶體分配的函式都是宣告在stdlib.h標頭檔案裡