Forskjellen mellom malloc() og calloc() med eksempler
Funksjonene malloc() og calloc() er bibliotekfunksjoner som tildeler minne dynamisk. Dynamisk betyr at minnet tildeles under kjøretid (utførelse av programmet) fra heap-segmentet.
Initialisering
malloc() tildeler en minneblokk av gitt størrelse (i byte) og returnerer en peker til begynnelsen av blokken. malloc() initialiserer ikke det tildelte minnet. Hvis du prøver å lese fra det tildelte minnet uten først å initialisere det, vil du påkalle udefinert atferd , som vanligvis betyr at verdiene du leser vil være søppelverdier.
calloc() allokerer minnet og initialiserer også hver byte i det tildelte minnet til 0. Hvis du prøver å lese verdien av det tildelte minnet uten å initialisere det, får du 0 da det allerede er initialisert til 0 av calloc().
Parametere
malloc() tar et enkelt argument, som er antall byte å tildele.
I motsetning til malloc(), tar calloc() to argumenter:
- Antall blokker som skal tildeles.
- Størrelsen på hver blokk i byte.
Returverdi
Etter vellykket allokering i malloc() og calloc(), returneres en peker til minneblokken ellers returneres NULL som indikerer feil.
Eksempel
C-koden nedenfor viser forskjellen mellom malloc- og calloc-funksjoner for å tildele dynamisk minne.
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);> }> |
Produksjon
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)
Forskjellen mellom malloc() og calloc() i C
La oss se forskjellene i en tabellform:
| Ja Nei. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() er en funksjon som lager én minneblokk med fast størrelse. | calloc() er en funksjon som tilordner et spesifisert antall minneblokker til en enkelt variabel. |
| 2. | malloc() tar bare ett argument | calloc() tar to argumenter. |
| 3. | malloc() er raskere enn calloc. | calloc() er tregere enn malloc() |
| 4. | malloc() har høy tidseffektivitet | calloc() har lav tidseffektivitet |
| 5. | malloc() brukes til å indikere minneallokering | calloc() brukes til å indikere sammenhengende minneallokering |
| 6. | Syntaks: void* malloc(størrelse_t størrelse); | Syntaks : void* calloc(størrelse_t antall, størrelse_t størrelse); |
| 8. | malloc() initialiserer ikke minnet til null | calloc() initialiserer minnet til null |
| 9. | malloc() legger ikke til ekstra minneoverhead | calloc() legger til litt ekstra minneoverhead |