C Dinaminis atminties paskirstymas naudojant malloc (), calloc (), free () & realloc ()

Šioje pamokoje sužinosite dinamiškai paskirstyti atmintį C programoje naudodami standartines bibliotekos funkcijas: malloc (), calloc (), free () ir realloc ().

Kaip žinote, masyvas yra fiksuoto skaičiaus reikšmių rinkinys. Deklaravus masyvo dydį, jo pakeisti negalima.

Kartais jūsų deklaruoto masyvo dydis gali būti nepakankamas. Norėdami išspręsti šią problemą, vykdymo metu galite rankiniu būdu paskirstyti atmintį. Tai žinoma kaip dinaminis atminties paskirstymas programuojant C.

Skirti atminties dinamiškai, bibliotekos funkcijos yra malloc(), calloc(), realloc()ir free()yra naudojama. Šios funkcijos yra apibrėžtos antraštės faile.

C malloc ()

Pavadinimas „malloc“ reiškia atminties paskirstymą.

malloc()Funkcija pasilieka atminties nurodyto baitų skaičius bloką. Ir jis grąžina žymeklį, voidkurį galima mesti į bet kokios formos žymeklį .

Malloko sintaksė ()

 ptr = (castType*) malloc(size);

Pavyzdys

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

Ankstesniame sakinyje yra skirta 400 baitų atminties. Taip yra todėl, kad dydis floatyra 4 baitai. Ir žymeklis ptr laiko pirmojo baito adresą priskirtoje atmintyje.

Išraiškos rezultatas yra NULLžymeklis, jei atminties negalima paskirstyti.

C calloc ()

Pavadinimas „calloc“ reiškia gretimą paskirstymą.

malloc()Funkcija skiria atminties ir palieka atminties sužadinimas. Tuo tarpu calloc()funkcija paskirsto atmintį ir visus bitus inicializuoja iki nulio.

„Calloc“ () sintaksė

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

Pavyzdys:

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

Pirmiau pateiktame teiginyje 25 tipo elementams atmintyje skiriama gretima erdvė float.

C nemokamai ()

Dinamiškai paskirstyta atmintis, sukurta naudojant vieną iš jų, calloc()arba malloc()ji pati neišlaisvinama. Turite aiškiai naudoti, free()kad išlaisvintumėte vietą.

Nemokamo sintaksė ()

 free(ptr);

Šis teiginys atlaisvina vietą, nurodytą atmintyje ptr.

1 pavyzdys: malloc () ir 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; ) 

Čia dinamiškai paskirstėme atmintį n skaičiui int.

2 pavyzdys: calloc () ir 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 ()

Jei dinamiškai paskirstytos atminties nepakanka arba jos reikia daugiau, naudodamiesi realloc()funkcija galite pakeisti anksčiau paskirstytos atminties dydį .

Realloc sintaksė ()

 ptr = realloc(ptr, x);

Čia ptr perskirstomas nauju dydžiu x.

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

Kai paleisite programą, išvestis bus:

 Įveskite dydį: 2 Anksčiau paskirtos atminties adresai: 26855472 26855476 Įveskite naują dydį: 4 Naujai paskirtos atminties adresai: 26855472 26855476 26855480 26855484

Įdomios straipsniai...