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: