C Dinamičko dodjeljivanje memorije pomoću malloc (), calloc (), free () & realloc ()

U ovom vodiču naučit ćete dinamički rasporediti memoriju u programu C koristeći standardne funkcije knjižnice: malloc (), calloc (), free () i realloc ().

Kao što znate, niz je zbirka fiksnog broja vrijednosti. Jednom kada je veličina polja deklarirana, ne možete je promijeniti.

Ponekad veličina niza koji ste proglasili može biti nedovoljna. Da biste riješili ovaj problem, možete ručno dodijeliti memoriju za vrijeme izvođenja. To je poznato kao dinamička dodjela memorije u programiranju na C-u.

Izdvojiti memorije dinamički, knjižnica funkcije malloc(), calloc(), realloc()i free()koriste se. Te su funkcije definirane u zaglavnoj datoteci.

C malloc ()

Naziv "malloc" označava dodjelu memorije.

malloc()Funkcija zadržava blok sjećanja na određeni broj bajtova. I vraća pokazivač voidkoji se može lijevati u pokazivače bilo kojeg oblika.

Sintaksa malloc ()

 ptr = (castType*) malloc(size);

Primjer

 ptr = (float*) malloc(100 * sizeof(float));

Gornja izjava izdvaja 400 bajtova memorije. To je zato što je veličina float4 bajta. I, pokazivač ptr sadrži adresu prvog bajta u dodijeljenoj memoriji.

Izraz rezultira NULLpokazivačem ako se memorija ne može dodijeliti.

C kalok ()

Naziv "calloc" označava susjednu alokaciju.

malloc()Funkcija izdvaja memorije i ostavlja sjećanje nepokrenute. Dok calloc()funkcija dodjeljuje memoriju i inicijalizira sve bitove na nulu.

Sintaksa calloc ()

 ptr = (castType*)calloc(n, size);

Primjer:

 ptr = (float*) calloc(25, sizeof(float));

Gornja izjava dodjeljuje susjedni prostor u memoriji za 25 elemenata tipa float.

C besplatno ()

Dinamički dodijeljena memorija stvorena s bilo kojim calloc()ili malloc()se ne oslobađa sama. Morate izričito koristiti free()za oslobađanje prostora.

Sintaksa slobodnog ()

 free(ptr);

Ova izjava oslobađa prostor dodijeljen u memoriji na koju ukazuje ptr.

Primjer 1: malloc () i 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; ) 

Ovdje smo dinamički dodijelili memoriju za n broj int.

Primjer 2: calloc () i 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 ()

Ako je dinamički dodijeljena memorija nedovoljna ili je veća od potrebne, možete promijeniti veličinu prethodno dodijeljene memorije pomoću realloc()funkcije.

Sintaksa realloc ()

 ptr = realloc(ptr, x);

Ovdje se ptr preraspodjeljuje s novom veličinom x.

Primjer 3: 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; )

Kada pokrenete program, izlaz će biti:

 Unesite veličinu: 2 adrese prethodno dodijeljene memorije: 26855472 26855476 Unesite novu veličinu: 4 adrese novo dodijeljene memorije: 26855472 26855476 26855480 26855484

Zanimljivi članci...