malloc()-funktio C-kirjastossa, jossa on EXAMPLE

โšก ร„lykรคs yhteenveto

C-kielen malloc() varaa ajonaikaisesti keosta muistilohkon ja palauttaa tyhjรคn osoittimen sen ensimmรคiseen tavuun, jolloin ohjelmat voivat pyytรครค tuntemattoman kokoista tallennustilaa, kunnes koodi itse asiassa suoritetaan.

  • ๐Ÿง  Suoritusajan allokointi: malloc() varaa muistia suorituksen aikana, kun vaadittua kokoa ei tiedetรค kรครคnnรถsaikana.
  • ๐Ÿ“ฆ Syntaksi: cast_type-osoitin vastaanottaa malloc(byte_size), jonka koko on yleensรค mรครคritetty sizeof-arvolla siirrettรคvyyden takaamiseksi.
  • โš ๏ธ NULL-tarkistus: Epรคonnistunut pyyntรถ palauttaa NULL-osoittimen, joten tarkista tulos ennen viittauksen poistamista.
  • โž• Osoittimen aritmetiikka: Lohko on yhtenรคinen, joten kรคytรค +-merkkiรค ++-merkin sijaan taulukon alkioihin pรครคsemiseksi.
  • ๐Ÿงน Vapauta muisti: Vapauta jokainen lohko free()-funktiolla muistivuotojen ja roikkuvien osoittimien estรคmiseksi.
  • ๐Ÿค– AI-apu: Tekoรคlyavustajat ja GitHub Copilot luonnostavat malloc()-kutsuja ja merkitsevรคt puuttuvia free()-lausekkeita.

malloc()-funktio C:ssรค

Mikรค on malloc C:ssรค?

Malloc()-funktio tarkoittaa muistin varausta. Se on toiminto, jota kรคytetรครคn varaamaan muistilohko dynaamisesti. Se varaa mรครคritetyn kokoisen muistitilan ja palauttaa muistipaikkaan osoittavan nollaosoittimen. Palautettu osoitin on yleensรค tyyppiรค void. Se tarkoittaa, ettรค voimme mรครคrittรครค malloc-funktion mille tahansa osoittimelle.

Mikรค on malloc C:ssรค

Syntaksi

ptr = (cast_type *) malloc (byte_size);

Tรครคllรค

  • ptr on cast_typen osoitin.
  • Malloc-funktio palauttaa osoittimen varattuun muistiin byte_size.
Example: ptr = (int *) malloc (50)

Kun tรคmรค kรคsky on suoritettu onnistuneesti, varataan 50 tavun muistitilaa. Varatun tilan ensimmรคisen tavun osoite on osoitettu osoittimelle ptr, jonka tyyppi on int.

Harkitse toista esimerkkiรค malloc-toteutuksesta:

#include <stdlib.h>
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));
    }
}

lรคhtรถ:

Value of the 6th integer is 480

Huomaa, ettรค sizeof(*ptr):ia kรคytettiin sizeof(int):in sijaan koodin vankemman toiminnan varmistamiseksi, kun *ptr-deklaraatio tyypitetรครคn myรถhemmin eri tietotyyppiin.

Varaus voi epรคonnistua, jos muisti ei riitรค. Tรคssรค tapauksessa se palauttaa NULL-osoittimen. Joten sinun tulee sisรคllyttรครค koodi tarkistaaksesi NULL-osoittimen.

Muista, ettรค varattu muisti on yhtenรคistรค ja sitรค voidaan kรคsitellรค taulukkona. Voimme kรคyttรครค osoitin aritmeettisia menetelmiรค taulukon alkioihin pรครคsemiseksi hakasulkeiden [] sijaan. Suosittelemme kรคyttรคmรครคn +-merkkiรค taulukon alkioihin viitattaessa, koska lisรคysten ++ tai += kรคyttรถ muuttaa osoittimen tallentamaa osoitetta.

Malloc-funktiota voidaan kรคyttรครค myรถs merkkitietotyypin sekรค monimutkaisten tietotyyppien, kuten rakenteiden, kanssa.

Miksi kรคyttรครค malloc()-funktiota C:ssรค?

Staattiset taulukot ja tavalliset muuttujat kiinteรคt koon ohjelman kรครคnnรถksen yhteydessรค, mikรค tuhlaa tilaa, kun vaatimus osoittautuu pienemmรคksi, ja epรคonnistuu suoraan, kun se osoittautuu suuremmaksi. malloc() ratkaisee tรคmรคn pyytรคmรคllรค muistia suorituksen aikana, joten ohjelma voi mitoittaa puskurin tarkasti vastaanottamansa datan mรครคrรคn mukaan. Tรคmรค suorituksenaikainen joustavuus on ohjelman ydin. dynaaminen muistin allokointi C:ssรค.

Dynaaminen allokointi malloc():n avulla on oikea valinta useissa yleisissรค tilanteissa:

  • Syรถtteen mรครคrรค on tuntematon, kunnes ohjelma suoritetaan, kuten tiedoston tai kรคyttรคjรคn toimittaman listan lukeminen.
  • Tarvitaan suuria lohkoja, jotka ylittรคisivรคt rajoitetun pinon, koska malloc() kรคyttรครค paljon suurempaa kekoa.
  • Datan on sรคilyttรคvรค pidempรครคn kuin sen luonut funktio, koska kekomuisti sรคilyy, kunnes se erikseen vapautetaan.
  • Rakenteiden ja taulukoiden tรคytyy kasvaa tai kutistua ohjelman suorituksen aikana.

Koska varattu lohko palautetaan osoittimena, se voidaan siirtรครค funktioiden vรคlillรค edullisesti kopioimatta pohjana olevaa dataa.

Kuinka vapauttaa malloc()-funktion varaamaa muistia

Malloc()-funktion varaama muisti sijaitsee keossa, eikรค sitรค koskaan vapauteta automaattisesti. Kun ohjelma varaa jatkuvasti muistia vapauttamatta sitรค, se kuluttaa hitaasti kaiken kรคytettรคvissรค olevan muistin. Tรคtรค vikaa kutsutaan muistivuodoksi. Free()-funktio palauttaa jรคrjestelmรคlle valmiin lohkon, jotta tilaa voidaan kรคyttรครค uudelleen.

Free()-funktio ottaa yhden argumentin, malloc()-funktion palauttaman osoittimen, ja vapauttaa koko lohkon kerralla:

int *ptr;
ptr = malloc(10 * sizeof(int));
if (ptr != NULL) {
    /* use the allocated memory here */
    free(ptr);   /* release the block */
    ptr = NULL;  /* avoid a dangling pointer */
}

Noudata nรคitรค sรครคntรถjรค hallitaksesi dynaamista muistia turvallisesti:

  • Kutsu free()-funktiota tasan kerran jokaista onnistunutta malloc()-funktiota kohden; saman lohkon vapauttaminen kahdesti aiheuttaa mรครคrittelemรคtรถntรค toimintaa.
  • Aseta osoitin vapauttamisen jรคlkeen arvoon NULL, jotta sitรค ei voida kรคyttรครค uudelleen roikkuvana osoitinena.
  • ร„lรค koskaan free()-funktiolla poista osoitinta, jota malloc() ei palauttanut, mukaan lukien osoittimen aritmetiikan siirtรคmรค osoitin.
  • Yhdistรค jokainen allokaatio vastaavaan vapautukseen ennen kuin osoitin poistuu laajuusalueelta.

Keeping Tasapainoinen allokointi ja vapauttaminen on C-kielen manuaalisen muistinhallinnan ydinosaamista, ja se estรครค sekรค vuodot ettรค kaatumiset, jotka johtuvat vapautuneen muistin uudelleenkรคytรถstรค.

malloc() vs. calloc(): Keskeiset erot

malloc() ja calloc() Molemmat varaavat kekomuistia, mutta ne eroavat toisistaan โ€‹โ€‹argumenttiensa ja uuden lohkon kรคsittelytavan suhteen. malloc() ottaa yhden argumentin, tavujen kokonaismรครคrรคn, ja jรคttรครค sisรคllรถn alustamattomaksi, joten lohko sรคilyttรครค arvaamattomia roska-arvoja, kunnes ohjelma kirjoittaa siihen. calloc() ottaa kaksi argumenttia, elementtien lukumรครคrรคn ja kunkin koon, ja tyhjentรครค jokaisen tavun nollaan ennen osoittimen palauttamista.

Kรคytรคnnรถn erot tiivistyvรคt kolmeen kohtaan:

  • Alustus: calloc() nollaa muistin, kun taas malloc() ei, mikรค tekee malloc():sta hieman nopeamman, kun arvot joka tapauksessa ylikirjoitetaan.
  • Argumentit: kirjoitat malloc(n * size), mutta calloc(n, size) varataksesi saman taulukon.
  • Kรคyttรถtapaus: valitse calloc(), kun puhdas, nollattu lohko on tรคrkeรค, ja malloc(), kun nopeus on etusijalla ja alustus hoidetaan manuaalisesti.

Molemmat funktiot deklaroidaan stdlib.h-tiedostossa, molemmat palauttavat virhetilanteessa tyhjรคn osoittimen tai NULL-arvon ja molemmat palauttavat muistinsa samalla free()-funktiolla.

UKK

C-kielessรค muunnos on valinnainen ja sitรค usein ei suositella, koska void* muuntaa automaattisesti miksi tahansa objektiosoittimeksi ja eksplisiittinen muunnos voi peittรครค puuttuvan stdlib.h-include-tiedoston. C++nรคyttelijรคt kuitenkin vaaditaan.

NULL-palautus tarkoittaa, ettรค pyyntรถ epรคonnistui, yleensรค muistin riittรคmรคttรถmyyden vuoksi. Tarkista osoitin aina ennen sen kรคyttรถรค, koska NULL-viittauksen poistaminen johtaa mรครคrittelemรคttรถmรครคn toimintaan ja yleensรค kaataa ohjelman.

realloc() muuttaa malloc()-funktion aiemmin varaaman lohkon kokoa, keeping olemassa olevaa dataa pienempรครคn kokoon asti. Jos se epรคonnistuu, se palauttaa NULL-arvon ja jรคttรครค alkuperรคisen lohkon ennalleen, joten aseta sen tulos ensin vรคliaikaiseen osoittimeen.

Muistivuoto tapahtuu, kun malloc()-funktion kekomuistia ei koskaan vapauteta free()-funktiolla. Ohjelma varaa jatkuvasti tilaa, jota se ei enรครค kรคytรค, mikรค voi vรคhitellen kuluttaa sen kรคytettรคvissรค olevan muistin loppuun.

malloc() varaa muistia keolle, ei pinolle. Keon lohkot pysyvรคt voimassa, kunnes kutsut free()-funktiota, joten ne voivat elรครค pidempรครคn kuin ne luonut funktio, toisin kuin automaattiset pinomuuttujat, jotka katoavat paluun yhteydessรค.

malloc() on kirjastofunktio, joka palauttaa void*-arvon ja tarvitsee sizeof-muuttujaa tavujen laskemiseen. C++ new on operaattori, joka palauttaa tyypin osoittavan funktion ja kutsuu konstruktoreita. Yhdistรค malloc() free()-funktion kanssa ja new delete-funktion kanssa.

Kyllรค. Tekoรคlykoodausavustajat luonnostelevat malloc()-kutsuja, lisรครคvรคt NULL-tarkistuksia ja merkitsevรคt puuttuvia free()-kutsuja tai vuotoja, ja he osaavat selittรครค osoittimen aritmetiikan. Kรครคnnรค ja testaa aina luotu koodi ennen kuin luotat siihen.

GitHub Copilot ehdottaa malloc()- ja sizeof()-funktioita sekรค vastaavia free()-rivejรค kommentista, joka kuvaa tarkoitustasi. RevTarkista kaikki ehdotukset puuttuvien NULL-tarkistusten ja vuotojen varalta ennen kรครคntรคmistรค.

Tiivistรค tรคmรค viesti seuraavasti: