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.
hva xd betyr
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. replaceall i streng java | 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 |