Dynaaminen muistin allokointi C: malloc (), calloc () -toiminnoissa

Sisällysluettelo:

Anonim

Ennen kuin opit C-dynaamisen muistin jakamisen, ymmärretään:

Kuinka muistinhallinta C: ssä toimii?

Kun ilmoitat muuttujan perustietotyypillä, C-kääntäjä varaa muuttujalle muistitilan automaattisesti pino- nimisessä muistialueessa .

Esimerkiksi kelluva muuttuja vie tyypillisesti 4 tavua (alustan mukaan), kun se ilmoitetaan. Voimme tarkistaa nämä tiedot operaattorin koon avulla alla olevan esimerkin mukaisesti

#include int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}

Tulos on:

 The size of float is 4 bytes 

Myös määritetyn kokoinen taulukko allokoidaan vierekkäisissä muistilohkoissa, jokaisella lohkolla on yhden elementin koko:

#include int main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;} 

Tulos on:

 The size of the float array with 10 element is 40

Kuten tähän mennessä on opittu, ilmoitettaessa perustietotyyppiä tai taulukkoa, muisti hallitaan automaattisesti. Muistin allokoimiseksi C: ssä on kuitenkin prosessi, jonka avulla voit toteuttaa ohjelman, jossa taulukon kokoa ei ole päätetty, kunnes suoritat ohjelman (ajonaikainen). Tätä prosessia kutsutaan " dynaamiseksi muistin allokoinniksi ".

Tässä opetusohjelmassa opit-

  • Kuinka muistinhallinta C: ssä toimii?
  • Dynaaminen muistin allokointi C.
  • C malloc () Toiminto
  • Vapaa () -toiminto
  • C calloc () -toiminto
  • calloc () vs. malloc (): Keskeiset erot
  • C realloc () -toiminto
  • Dynaamiset taulukot

Dynaaminen muistin allokointi C.

Dynaaminen muistin allokointi on manuaalinen allokointi ja muistin vapauttaminen ohjelmointitarpeidesi mukaan. Dynaamista muistia hallitaan ja sitä käytetään osoittimilla, jotka osoittavat vasta varattua muistia alueella, jota kutsumme kasaksi.

Nyt voit luoda ja tuhota joukon elementtejä dynaamisesti ajon aikana ilman ongelmia. Yhteenvetona voidaan todeta, että automaattinen muistinhallinta käyttää pinoa ja C-dynaaminen muistin allokointi kasaa.

-kirjastossa on toiminnot, jotka vastaavat dynaamisesta muistinhallinnasta.

Toiminto Tarkoitus
malloc () Varaa halutun koon muistin ja palauttaa osoittimen varatun tilan ensimmäiseen tavuun.
calloc () Varaa matriisin elementtien tilaa. Alustaa elementit nollaksi ja palauttaa osoittimen muistiin.
realloc () Sitä käytetään aiemmin varatun muistitilan koon muuttamiseen.
Vapaa() Vapauttaa tai tyhjentää aiemmin varatun muistitilan.

Keskustellaan edellä mainituista toiminnoista niiden sovelluksen kanssa

C malloc () Toiminto

C malloc () -toiminto tarkoittaa muistin allokointia. Se on toiminto, jota käytetään muistilohkon varaamiseen dynaamisesti. Se varaa tietyn kokoisen muistitilan ja palauttaa tyhjän osoittimen muistipaikkaan. Palautettu osoitin on tyypiltään tyhjä. Se tarkoittaa, että voimme määrittää C malloc () -funktion mille tahansa osoittimelle.

Mallocin syntaksi () Funktio:

ptr = (cast_type *) malloc (byte_size);

Tässä,

  • ptr on osoitin cast_type.
  • C malloc () -toiminto palauttaa osoittimen tavun koon varattuun muistiin.

Esimerkki mallocista ():

Example: ptr = (int *) malloc (50)

Kun tämä lause on suoritettu onnistuneesti, varataan 50 tavun muistitila. Varatun tilan ensimmäisen tavun osoite on osoitettu osoitintyypille ptr, jonka tyyppi on int.

Harkitse toista esimerkkiä:

#include int 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));}}

Tuotos:

Value of the 6th integer is 480

  1. Huomaa, että sizeof (* ptr) -koodia käytettiin sizeof (int) -tekniikan sijasta, jotta koodista saataisiin vankempi, kun * ptr-ilmoitus määritetään myöhemmin toiseen tietotyyppiin.
  2. Kohdistus voi epäonnistua, jos muisti ei riitä. Tässä tapauksessa se palauttaa NULL-osoittimen. Joten sinun tulisi sisällyttää koodi tarkistaa NULL-osoitin.
  3. Muista, että varattu muisti on vierekkäistä ja sitä voidaan käsitellä matriisina. Voimme käyttää osoittimen aritmeettista pääsyä matriisielementteihin hakasulkeiden sijaan. Suosittelemme käyttämään + viittaamaan taulukkoelementteihin, koska lisäys ++ tai + = muuttaa osoittimen tallentaman osoitteen.

Malloc () -funktiota voidaan käyttää myös merkkitietotyypin sekä monimutkaisten tietotyyppien, kuten rakenteiden, kanssa.

Vapaa () -toiminto

Muuttujien muisti jaetaan automaattisesti kääntöhetkellä. Dynaamisessa muistin allokoinnissa sinun on kohdennettava muisti nimenomaisesti. Jos sitä ei tehdä, saatat kohdata muistivirheen.

Ilmaista () -toimintoa kutsutaan vapauttamaan / jakamaan muisti C: ssä. Vapauttamalla muistia ohjelmassasi, annat enemmän käytettäväksi myöhemmin.

Esimerkiksi:

#include int 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);}

Tuotos

 Value of the 2nd integer is 50

C calloc () -toiminto

C calloc () -toiminto tarkoittaa vierekkäistä allokointia. Tätä toimintoa käytetään jakamaan useita muistilohkoja. Se on dynaaminen muistinjakotoiminto, jota käytetään muistin varaamiseen monimutkaisille tietorakenteille, kuten matriiseille ja rakenteille.

Malloc () -toimintoa käytetään varaamaan yksi lohko muistitilaa, kun taas C: n calloc (): ta käytetään monien muistitilalohkojen varaamiseen. Jokainen calloc () -funktion varaama lohko on saman kokoinen.

Calloc () -funktion syntaksi:

ptr = (cast_type *) calloc (n, size);
  • Yllä olevaa lausetta käytetään varaamaan n saman kokoista muistilohkoa.
  • Kun muistitila on varattu, kaikki tavut alustetaan nollaan.
  • Osoitin, joka on tällä hetkellä varatun muistitilan ensimmäisellä tavulla, palautetaan.

Aina kun muistitilan kohdentamisessa tapahtuu virhe, kuten muistin puute, palautetaan nollaosoitin.

Esimerkki calloc ():

Alla oleva ohjelma laskee aritmeettisen sekvenssin summan.

#include int 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;}

Tulos:

Building and calculating the sequence sum of the first 10 termsSum = 45

calloc () vs. malloc (): Keskeiset erot

Seuraava on tärkein ero malloc () Vs calloc (): n välillä C: ssä:

Calloc () -toiminto on yleensä sopivampi ja tehokkaampi kuin malloc () -funktio. Vaikka molempia toimintoja käytetään muistitilan varaamiseen, calloc () voi allokoida useita lohkoja kerralla. Sinun ei tarvitse pyytää muistilohkoa joka kerta. Calloc () -funktiota käytetään monimutkaisissa datarakenteissa, jotka vaativat suurempaa muistitilaa.

C: ssä olevan calloc: n () varaama muistilohko alustetaan aina nollaan, kun taas toiminnossa malloc () C: ssä se sisältää aina roska-arvon.

C realloc () -toiminto

C realloc () -toiminnon avulla voit lisätä muistikokoa jo varattuun muistiin. Se laajentaa nykyistä lohkoa ja jättää alkuperäisen sisällön sellaisenaan. C: n realloc () tarkoittaa muistin uudelleenjakoa.

realloc () -toimintoa voidaan käyttää myös aiemmin varatun muistin koon pienentämiseen.

Realloc () -syntaksi Funktio:

ptr = realloc (ptr,newsize);

Yllä oleva lauseke varaa uuden muistitilan, jolla on määritelty koko muuttujassa newsize. Toiminnon suorittamisen jälkeen osoitin palautetaan muistilohkon ensimmäiseen tavuun. Uusi koko voi olla suurempi tai pienempi kuin edellinen muisti. Emme voi olla varmoja siitä, että jos uusi varattu lohko osoittaa samaan sijaintiin kuin edellinen muistilohko. Tämä toiminto kopioi kaikki aiemmat tiedot uudelta alueelta. Se varmistaa, että tiedot pysyvät turvassa.

Esimerkki realloc ():

#include int 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;} 

Aina kun C: n realloc () johtaa epäonnistuneeseen operaatioon, se palauttaa tyhjän osoittimen ja myös edelliset tiedot vapautetaan.

Dynaamiset taulukot C.

Dynaaminen taulukko C: ssä antaa elementtien lukumäärän kasvaa tarpeen mukaan. C Dynaamista taulukkoa käytetään laajalti tietojenkäsittelytieteen algoritmeissa.

Seuraavassa ohjelmassa olemme luoneet ja muuttaneet dynaamisen taulukon kokoa C: ssä

#include int 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);} 

C Dynamic array -ohjelman tulos näytöllä:

arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3

Yhteenveto

  • Voimme hallita muistia dynaamisesti luomalla muistilohkoja tarpeen mukaan
  • C-dynaamisessa muistin allokoinnissa muisti varataan ajoaikana.
  • Dynaaminen muistin allokointi sallii joustavien merkkijonojen ja matriisien manipuloinnin, joita voidaan muuttaa milloin tahansa ohjelmassa.
  • Sitä tarvitaan, kun sinulla ei ole aavistustakaan, kuinka paljon muistia tietty rakenne aikoo käyttää.
  • Malloc () C: ssä on dynaaminen muistin allokointitoiminto, joka tarkoittaa muistin allokointia, joka estää muistin, jonka tietty koko alustetaan roska-arvoon.
  • Calloc () C: ssä on vierekkäinen muistin allokointitoiminto, joka allokoi useita muistilohkoja kerrallaan nollaksi
  • Realloc () C: ssä käytetään muistin uudelleenjakoon määritetyn koon mukaan.
  • Free () -toimintoa käytetään dynaamisesti allokoidun muistin tyhjentämiseen.