logo

Skirtumas tarp malloc () ir calloc () su pavyzdžiais

Funkcijos malloc () ir calloc() yra bibliotekos funkcijos, kurios dinamiškai paskirsto atmintį. Dinaminis reiškia, kad atmintis yra paskirstoma vykdymo metu (programos vykdymo metu) iš krūvos segmento.

Inicijavimas

malloc () paskiria nurodyto dydžio atminties bloką (baitais) ir grąžina rodyklę į bloko pradžią. malloc() neinicijuoja skirtos atminties. Jei bandysite nuskaityti iš paskirtos atminties, prieš tai jos neinicijuoję, iškviesite neapibrėžtą elgesį, o tai paprastai reiškia, kad skaitomos reikšmės bus šiukšlinės.



javascript įspėjimo laukelis

calloc() paskirsto atmintį ir taip pat inicijuoja kiekvieną baitą paskirstytoje atmintyje į 0. Jei bandysite nuskaityti paskirtos atminties reikšmę jos neinicializuodami, gausite 0, nes ji jau buvo inicijuota į 0 naudojant calloc().

Parametrai

malloc() paima vieną argumentą, kuris yra paskirstytinų baitų skaičius.

Skirtingai nuo malloc (), calloc () turi du argumentus:



  1. Skirtinų blokų skaičius.
  2. Kiekvieno bloko dydis baitais.

Grąžinimo vertė

Po sėkmingo paskirstymo malloc () ir calloc (), rodyklė į atminties bloką grąžinama, kitaip grąžinama NULL, o tai rodo gedimą.

Pavyzdys

Žemiau pateiktas C kodas parodo skirtumą tarp malloc ir calloc funkcijų, skirtų dinaminei atminčiai paskirstyti.

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);> }>

>

>

konverteris iš eilutės į int
Išvestis

Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>

Skirtumas tarp malloc () ir calloc () C

Pažiūrėkime skirtumus lentelės pavidalu:

Taip ne.

malloc ()

calloc()

1.

malloc() yra funkcija, kuri sukuria vieną fiksuoto dydžio atminties bloką. calloc() yra funkcija, kuri vienam kintamajam priskiria tam tikrą atminties blokų skaičių.

2.

malloc() turi tik vieną argumentą calloc() turi du argumentus.

3.

malloc() yra greitesnis nei calloc. calloc() yra lėtesnis nei malloc()

4.

malloc() turi didelį laiko efektyvumą calloc() turi mažą laiko efektyvumą

5.

malloc() naudojamas atminties paskirstymui nurodyti calloc() naudojamas gretimam atminties paskirstymui nurodyti

6.

Sintaksė : void* malloc(dydis_t dydis); Sintaksė : void* calloc(dydis_t skaičius, dydis_t dydis);

8.

malloc() nepakeičia atminties iki nulio calloc() inicijuoja atmintį iki nulio

9.

malloc() neprideda jokios papildomos atminties calloc() prideda šiek tiek papildomos atminties

susiję straipsniai