Funktionerne malloc() og calloc() er biblioteksfunktioner, der tildeler hukommelse dynamisk. Dynamisk betyder, at hukommelsen tildeles under runtime (udførelse af programmet) fra heap-segmentet.
Initialisering
malloc() allokerer en hukommelsesblok af given størrelse (i bytes) og returnerer en pointer til begyndelsen af blokken. malloc() initialiserer ikke den tildelte hukommelse. Hvis du forsøger at læse fra den tildelte hukommelse uden først at initialisere den, vil du påkalde udefineret adfærd , hvilket normalt betyder, at de værdier, du læser, vil være skraldværdier.
matrix multiplikation i c
calloc() allokerer hukommelsen og initialiserer også hver byte i den allokerede hukommelse til 0. Hvis du forsøger at læse værdien af den allokerede hukommelse uden at initialisere den, får du 0, da den allerede er blevet initialiseret til 0 af calloc().
Parametre
malloc() tager et enkelt argument, som er antal bytes at tildele.
I modsætning til malloc() tager calloc() to argumenter:
- Antal blokke, der skal tildeles.
- Størrelsen af hver blok i bytes.
Returværdi
Efter vellykket allokering i malloc() og calloc(), returneres en pointer til hukommelsesblokken ellers returneres NULL, hvilket indikerer fejl.
Eksempel
Nedenstående C-kode demonstrerer forskellen mellem malloc- og calloc-funktioner til at allokere dynamisk hukommelse.
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);> }> |
>
>Produktion
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Forskellen mellem malloc() og calloc() i C
Lad os se forskellene i en tabelform:
| Ja Nej. hvad er 10 af 1 mio | malloc() | calloc() |
|---|---|---|
| 1. | malloc() er en funktion, der opretter én hukommelsesblok af en fast størrelse. | calloc() er en funktion, der tildeler et specificeret antal hukommelsesblokke til en enkelt variabel. |
| 2. | malloc() tager kun ét argument | calloc() tager to argumenter. |
| 3. | malloc() er hurtigere end calloc. | calloc() er langsommere end malloc() |
| 4. | malloc() har høj tidseffektivitet | calloc() har lav tidseffektivitet |
| 5. | malloc() bruges til at angive hukommelsesallokering | calloc() bruges til at angive sammenhængende hukommelsesallokering |
| 6. | Syntaks: void* malloc(størrelse_t størrelse); | Syntaks : void* calloc(størrelse_t antal, størrelse_t størrelse); |
| 8. | malloc() initialiserer ikke hukommelsen til nul | calloc() initialiserer hukommelsen til nul |
| 9. | malloc() tilføjer ikke ekstra hukommelsesoverhead | calloc() tilføjer noget ekstra hukommelsesoverhead |