Ebben az oktatóanyagban megtanulja dinamikusan lefoglalni a memóriát a C programban a szokásos könyvtárfunkciók használatával: malloc (), calloc (), free () és realloc ().
Mint tudják, egy tömb rögzített számú érték gyűjteménye. Ha egy tömb méretét deklarálta, akkor nem módosíthatja.
Előfordul, hogy a deklarált tömb mérete elégtelen lehet. A probléma megoldásához manuálisan rendelhet memóriát futás közben. Ezt a C programozásban dinamikus memóriafoglalásnak nevezik.
Memóriát dinamikusan könyvtári funkciók malloc()
, calloc()
, realloc()
és free()
használnak. Ezeket a függvényeket a fejlécfájl határozza meg .
C malloc ()
A "malloc" név a memóriafoglalást jelenti.
A malloc()
függvény fenntart egy blokkot a megadott számú bájt memóriájához. És visszaad egy mutatót, void
amelynek bármilyen formájú mutatóba dobható.
A malloc szintaxisa ()
ptr = (castType*) malloc(size);
Példa
ptr = (float*) malloc(100 * sizeof(float));
A fenti utasítás 400 bájt memóriát oszt ki. Azért, mert a mérete float
4 bájt. És a ptr mutató az első bájt címét tárolja a lefoglalt memóriában.
A kifejezés NULL
mutatót eredményez, ha a memóriát nem lehet lefoglalni.
C calloc ()
A "calloc" név egybefüggő allokációt jelent.
A malloc()
funkció lefoglalja a memóriát, és inicializálatlanul hagyja a memóriát. Míg a calloc()
függvény lefoglalja a memóriát és inicializálja az összes bitet nullára.
A calloc () szintaxisa
ptr = (castType*)calloc(n, size);
Példa:
ptr = (float*) calloc(25, sizeof(float));
A fenti utasítás 25 memóriaelemhez rendel egybefüggő helyet a memóriában float
.
C mentes ()
Dinamikusan lefoglalt memória, amely bármelyikükkel létrehozott, calloc()
vagy malloc()
nem szabadul fel önmagukban. A free()
hely felszabadításához kifejezetten használnia kell.
A szabad szintaxisa ()
free(ptr);
Ez a kijelentés felszabadítja a memória által kijelölt helyet ptr
.
1. példa: malloc () és free ()
// Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; )
Itt dinamikusan lefoglaltuk a memóriát n számra int
.
2. példa: calloc () és free ()
// Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; )
C realloc ()
Ha a dinamikusan lefoglalt memória nem elegendő vagy meghaladja a szükséges mértéket, a realloc()
funkció segítségével megváltoztathatja a korábban lefoglalt memória méretét .
A realloc () szintaxisa
ptr = realloc(ptr, x);
Itt a ptr átcsoportosítva egy új x méretre.
3. példa: realloc ()
#include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )
A program futtatásakor a kimenet a következő lesz:
Adja meg a méretet: 2 A korábban lefoglalt memória címei: 26855472 26855476 Írja be az új méretet: 4 Az újonnan lefoglalt memória címei: 26855472 26855476 26855480 26855484