Les funcions malloc() i calloc() són funcions de biblioteca que assignen memòria dinàmicament. Dinàmica significa que la memòria s'assigna durant el temps d'execució (execució del programa) des del segment de pila.
Inicialització
malloc() assigna un bloc de memòria d'una mida determinada (en bytes) i retorna un punter al començament del bloc. malloc() no inicialitza la memòria assignada. Si intenteu llegir des de la memòria assignada sense inicialitzar-la primer, invocareu un comportament indefinit, que normalment significa que els valors que llegiu seran valors d'escombraries.
xarxa neuronal artificial
calloc() assigna la memòria i també inicialitza cada byte de la memòria assignada a 0. Si intenteu llegir el valor de la memòria assignada sense inicialitzar-la, obtindreu 0 ja que ja s'ha inicialitzat a 0 per calloc().
Paràmetres
malloc() pren un sol argument, que és el nombre de bytes per assignar.
A diferència de malloc(), calloc() pren dos arguments:
- Nombre de blocs a assignar.
- Mida de cada bloc en bytes.
Valor de retorn
Després d'una assignació correcta a malloc() i calloc(), es retorna un punter al bloc de memòria, en cas contrari es retorna NULL, que indica un error.
Exemple
El codi C següent mostra la diferència entre les funcions malloc i calloc per assignar memòria dinàmica.
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);> }> |
>
>Sortida
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Diferència entre malloc() i calloc() a C
Vegem les diferències en forma tabular:
| S.No. | malloc() | calloc() |
|---|---|---|
| 1. si per resum de rudyard kipling | malloc() és una funció que crea un bloc de memòria de mida fixa. | calloc() és una funció que assigna un nombre especificat de blocs de memòria a una sola variable. |
| 2. | malloc() només pren un argument | calloc() pren dos arguments. |
| 3. | malloc() és més ràpid que calloc. | calloc() és més lent que malloc() |
| 4. | malloc() té una alta eficiència temporal | calloc() té poca eficiència temporal |
| 5. | malloc() s'utilitza per indicar l'assignació de memòria | calloc() s'utilitza per indicar l'assignació de memòria contigua |
| 6. | Sintaxi: void* malloc (mida_t mida); | Sintaxi: void* calloc(size_t num, size_t size); |
| 8. | malloc() no inicialitza la memòria a zero | calloc() inicialitza la memòria a zero |
| 9. | malloc() no afegeix cap sobrecàrrega de memòria addicional | calloc() afegeix una mica de sobrecàrrega de memòria addicional |