Preden se naučite dodeljevanja dinamičnega pomnilnika C, razumemo:
Kako deluje upravljanje s pomnilnikom v jeziku C?
Ko spremenljivko prijavite z osnovnim podatkovnim tipom, prevajalnik C samodejno dodeli pomnilniški prostor za spremenljivko v pomnilniškem področju, imenovanem sklad .
Na primer, spremenljivka float običajno sprejme 4 bajte (glede na platformo), ko je deklarirana. Te podatke lahko preverimo z operatorjem sizeof , kot je prikazano v spodnjem primeru
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Rezultat bo:
The size of float is 4 bytes
Tudi matrika z določeno velikostjo je dodeljena v sosednjih blokih pomnilnika, vsak blok ima velikost za en element:
#includeint main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Rezultat je:
The size of the float array with 10 element is 40
Kot smo že ugotovili, se pri razglasitvi osnovnega podatkovnega tipa ali polja pomnilnik samodejno upravlja. Vendar pa obstaja postopek za dodeljevanje pomnilnika v jeziku C, ki vam bo omogočil izvajanje programa, v katerem velikost polja ni določena, dokler ne zaženete programa (izvajalnega okolja). Ta postopek se imenuje " Dinamično dodeljevanje pomnilnika ."
V tej vadnici boste izvedeli-
- Kako deluje upravljanje s pomnilnikom v jeziku C?
- Dinamično dodeljevanje pomnilnika v C
- Funkcija C malloc ()
- Brezplačna () funkcija
- Funkcija C calloc ()
- calloc () v primerjavi s malloc (): Ključne razlike
- Funkcija C realloc ()
- Dinamični nizi
Dinamično dodeljevanje pomnilnika v C
Dinamično dodeljevanje pomnilnika je ročno dodeljevanje in sproščanje pomnilnika glede na vaše programske potrebe. Dinamični pomnilnik upravlja in streže s kazalci, ki kažejo na novo dodeljeni pomnilniški prostor na območju, ki ga imenujemo kup.
Zdaj lahko med izvajanjem brez težav dinamično ustvarite in uničite vrsto elementov. Če povzamemo, samodejno upravljanje pomnilnika uporablja kup, C Dynamic Memory Allocation pa kup.
Knjižnica
Funkcija | Namen |
malloc () | Dodeljuje pomnilnik zahtevane velikosti in vrne kazalec na prvi bajt dodeljenega prostora. |
calloc () | Dodeljuje prostor za elemente polja. Inicializira elemente na nič in vrne kazalec v pomnilnik. |
realloc () | Uporablja se za spreminjanje velikosti predhodno dodeljenega pomnilniškega prostora. |
Prost() | Sprosti ali izprazni prej dodeljeni pomnilniški prostor. |
Pogovorimo se o zgornjih funkcijah z njihovo uporabo
Funkcija C malloc ()
Funkcija C malloc () pomeni dodeljevanje pomnilnika. To je funkcija, ki se uporablja za dinamično dodeljevanje bloka pomnilnika. Pridržuje pomnilniški prostor določene velikosti in vrne ničelni kazalec, ki kaže na mesto pomnilnika. Vrnjeni kazalec je običajno tipa void. To pomeni, da lahko kateremu koli kazalcu dodelimo funkcijo C malloc ().
Sintaksa funkcije malloc ():
ptr = (cast_type *) malloc (byte_size);
Tukaj,
- ptr je kazalec cast_type.
- Funkcija C malloc () vrne kazalec na dodeljeni pomnilnik byte_size.
Primer malloc ():
Example: ptr = (int *) malloc (50)
Ko je ta stavek uspešno izveden, je rezerviran pomnilniški prostor 50 bajtov. Naslov prvega bajta rezerviranega prostora je dodeljen kazalcu ptr tipa int.
Poglejmo še en primer:
#includeint main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}
Izhod:
Value of the 6th integer is 480
- Upoštevajte, da je bil namesto sizeof (int) uporabljen sizeof (* ptr), da je bila koda bolj robustna, ko je deklaracija * ptr pozneje vnesena v drug podatkovni tip.
- Dodelitev morda ne bo uspela, če pomnilnika ne bo dovolj. V tem primeru vrne kazalec NULL. Torej, vključite kodo, da preverite, ali je kazalec NULL.
- Upoštevajte, da je dodeljeni pomnilnik soseden in ga je mogoče obravnavati kot matriko. Za dostop do elementov matrike lahko uporabimo aritmetiko kazalca, namesto da uporabimo oklepaje []. Svetujemo, da uporabite + za sklicevanje na elemente matrike, ker z uporabo povečanja ++ ali + = spremenite naslov, ki ga shrani kazalec.
Funkcijo Malloc () je mogoče uporabiti tudi s podatkovnim tipom znakov, pa tudi s kompleksnimi podatkovnimi tipi, kot so strukture.
Brezplačna () funkcija
Pomnilnik za spremenljivke se samodejno sprosti v času prevajanja. Pri dinamičnem dodeljevanju pomnilnika morate pomnilnik izrecno odstraniti. Če tega ne storite, lahko naletite na napako.
Funkcija free () je poklicana za sprostitev / sprostitev pomnilnika v C. S sprostitvijo pomnilnika v programu naredite več na voljo za kasnejšo uporabo.
Na primer:
#includeint main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Izhod
Value of the 2nd integer is 50
Funkcija C calloc ()
Funkcija C calloc () pomeni sosednjo dodelitev. Ta funkcija se uporablja za dodelitev več blokov pomnilnika. Gre za funkcijo dinamičnega dodeljevanja pomnilnika, ki se uporablja za dodelitev pomnilnika kompleksnim podatkovnim strukturam, kot so nizi in strukture.
Funkcija Malloc () se uporablja za dodelitev enega bloka pomnilniškega prostora, calloc () v C pa za dodelitev več blokov pomnilniškega prostora. Vsak blok, ki ga dodeli funkcija calloc (), je enake velikosti.
Sintaksa funkcije calloc ():
ptr = (cast_type *) calloc (n, size);
- Zgornji stavek se uporablja za dodelitev n pomnilniških blokov enake velikosti.
- Po dodelitvi pomnilniškega prostora se vsi bajti inicializirajo na nič.
- Vrnjen je kazalec, ki je trenutno v prvem bajtu dodeljenega pomnilniškega prostora.
Kadar pride do napake pri dodeljevanju pomnilniškega prostora, kot je pomanjkanje pomnilnika, se vrne ničelni kazalec.
Primer calloc ():
Spodnji program izračuna vsoto aritmetičnega zaporedja.
#includeint main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Rezultat:
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc () v primerjavi s malloc (): Ključne razlike
Sledi ključna razlika med malloc () Vs calloc () v C:
Funkcija calloc () je na splošno primernejša in učinkovitejša od funkcije malloc (). Medtem ko se obe funkciji uporabljata za dodelitev pomnilniškega prostora, lahko calloc () dodeli več blokov hkrati. Ni vam treba vsakič zahtevati pomnilniškega bloka. Funkcija calloc () se uporablja v zapletenih podatkovnih strukturah, ki zahtevajo več prostora v pomnilniku.
Pomnilniški blok, dodeljen z calloc () v C, se vedno inicializira na nič, medtem ko v funkciji malloc () v C vedno vsebuje vrednost smeti.
Funkcija C realloc ()
S funkcijo C realloc () lahko že dodeljenemu pomnilniku dodate več pomnilnika. Razširi trenutni blok, hkrati pa pusti prvotno vsebino, kakršna je. realloc () v C pomeni prerazporeditev spomina.
realloc () lahko uporabite tudi za zmanjšanje velikosti predhodno dodeljenega pomnilnika.
Sintaksa funkcije realloc ():
ptr = realloc (ptr,newsize);
Zgornji stavek dodeli nov pomnilniški prostor z določeno velikostjo v spremenljivki newsize. Po izvedbi funkcije se kazalec vrne na prvi bajt pomnilniškega bloka. Nova velikost je lahko večja ali manjša od prejšnjega pomnilnika. Ne moremo biti prepričani, ali bo novo dodeljeni blok kazal na isto mesto kot prejšnji pomnilniški blok. Ta funkcija bo kopirala vse prejšnje podatke v novi regiji. Zagotavlja, da bodo podatki ostali varni.
Primer realloc ():
#includeint main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;}
Kadarkoli realloc () v C povzroči neuspešno operacijo, vrne ničelni kazalec in sprostijo se tudi prejšnji podatki.
Dinamična polja v C
Dinamično polje v C omogoča, da število elementov raste po potrebi. C Dinamična matrika se pogosto uporablja v algoritmih računalništva.
V naslednjem programu smo v C ustvarili in spremenili velikost dinamičnega polja
#includeint main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);}
Rezultat programa C Dynamic array na zaslonu:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Povzetek
- Spomin lahko dinamično upravljamo z ustvarjanjem pomnilniških blokov, kot jih potrebuje kup
- V dinamični dodelitvi pomnilnika C se pomnilnik dodeli med izvajanjem.
- Dinamično dodeljevanje pomnilnika omogoča obdelavo nizov in nizov, katerih velikost je prilagodljiva in jo lahko kadar koli spremenite v programu.
- Zahteva se, če sploh ne veste, koliko pomnilnika bo zasedla določena struktura.
- Malloc () v C je dinamična funkcija dodeljevanja pomnilnika, ki pomeni dodeljevanje pomnilnika, ki blokira pomnilnik s posebno velikostjo, inicializirano na vrednost smeti
- Calloc () v C je neprekinjena funkcija dodeljevanja pomnilnika, ki hkrati dodeli več pomnilniških blokov, inicializiranih na 0
- Realloc () v jeziku C se uporablja za prerazporeditev pomnilnika glede na določeno velikost.
- Funkcija Free () se uporablja za čiščenje dinamično dodeljenega pomnilnika.