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.

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.
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.

