Toiminnot malloc() ja calloc() ovat kirjastotoimintoja, jotka varaavat muistia dynaamisesti. Dynaaminen tarkoittaa, että muisti varataan ajon aikana (ohjelman suorittamisen) kasosegmentistä.
Alustus
malloc() varaa tietyn kokoisen muistilohkon (tavuina) ja palauttaa osoittimen lohkon alkuun. malloc() ei alusta varattua muistia. Jos yrität lukea varatusta muistista alustamatta sitä ensin, käynnistät määrittelemättömän käyttäytymisen, mikä yleensä tarkoittaa, että lukemasi arvot ovat roska-arvoja.
rivi vs sarake
calloc() varaa muistin ja alustaa myös varatun muistin jokaisen tavun nollaksi. Jos yrität lukea varatun muistin arvon alustamatta sitä, saat 0:n, koska se on jo alustettu 0:ksi calloc(:lla).
Parametrit
malloc() ottaa yhden argumentin, joka on allokoitavien tavujen määrä.
Toisin kuin malloc(), calloc() käyttää kaksi argumenttia:
- Jaettavien lohkojen lukumäärä.
- Kunkin lohkon koko tavuina.
Palautusarvo
Onnistuneen allokoinnin jälkeen malloc()- ja calloc()-ohjelmissa palautetaan osoitin muistilohkoon, muuten palautetaan NULL, mikä osoittaa epäonnistumisen.
Esimerkki
Alla oleva C-koodi osoittaa eron malloc- ja calloc-funktioiden välillä dynaamisen muistin varaamiseksi.
C
// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> >// Both of these allocate the same number of bytes,> >// which is the amount of bytes that is required to> >// store 5 int values.> >// The memory allocated by calloc will be> >// zero-initialized, but the memory allocated with> >// malloc will be uninitialized so reading it would be> >// undefined behavior.> >int>* allocated_with_malloc =>malloc>(5 *>sizeof>(>int>));> >int>* allocated_with_calloc =>calloc>(5,>sizeof>(>int>));> >// As you can see, all of the values are initialized to> >// zero.> >printf>(>'Values of allocated_with_calloc: '>);> >for> (>size_t> i = 0; i <5; ++i) {> >printf>(>'%d '>, allocated_with_calloc[i]);> >}> >putchar>(>'
'>);> >// This malloc requests 1 terabyte of dynamic memory,> >// which is unavailable in this case, and so the> >// allocation fails and returns NULL.> >int>* failed_malloc =>malloc>(1000000000000);> >if> (failed_malloc == NULL) {> >printf>(>'The allocation failed, the value of '> >'failed_malloc is: %p'>,> >(>void>*)failed_malloc);> >}> >// Remember to always free dynamically allocated memory.> >free>(allocated_with_malloc);> >free>(allocated_with_calloc);> }> |
>
>Lähtö
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Ero malloc():n ja calloc():n välillä C:ssä
Katsotaanpa erot taulukkomuodossa:
| Kyllä ei. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() on funktio, joka luo yhden kiinteän kokoisen muistilohkon. | calloc() on funktio, joka määrittää tietyn määrän muistilohkoja yhdelle muuttujalle. |
| 2. | malloc() ottaa vain yhden argumentin | calloc() ottaa kaksi argumenttia. |
| 3. | malloc() on nopeampi kuin calloc. | calloc() on hitaampi kuin malloc() |
| 4. | malloc():lla on korkea aikatehokkuus | calloc():lla on alhainen aikatehokkuus |
| 5. | malloc():ta käytetään osoittamaan muistin varaus | calloc():ta käytetään osoittamaan jatkuvaa muistin varausta |
| 6. java-merkkijono kokonaisluvuksi | Syntaksi : void* malloc(koko_t koko); | Syntaksi : void* calloc(size_t num, size_t size); |
| 8. | malloc() ei alusta muistia nollaan | calloc() alustaa muistin nollaan |
| 9. | malloc() ei lisää ylimääräistä muistia | calloc() lisää ylimääräistä muistia |