Cuando calloc se utiliza para asignar un bloque de memoria, la región asignada se inicializa a ceros. A diferencia de, malloc no toca el contenido del bloque de memoria asignado, lo que significa que contiene valores de basura. Esto podría ser un riesgo de seguridad porque los contenidos de la memoria son impredecibles y los errores de programación pueden provocar una filtración de estos contenidos..
calloc | malloc | |
---|---|---|
Función | asigna una región de memoria lo suficientemente grande como para contener "n elementos" de "tamaño" bytes cada uno. También inicializa contenidos de memoria a ceros.. | asigna "tamaño" bytes de memoria. |
Número de argumentos | 2 | 1 |
Sintaxis | void * calloc (number_of_blocks, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Contenidos de la memoria asignada. | La región asignada se inicializa a cero. | Los contenidos de la memoria asignada no se modifican. es decir, la memoria contiene valores impredecibles o de basura. Esto presenta un riesgo.. |
Valor de retorno | puntero void (void *). Si la asignación se realiza correctamente, se devuelve un puntero al bloque de memoria. Si la asignación de memoria falla, se devuelve un puntero NULL. | puntero void (void *). Si la asignación se realiza correctamente, se devuelve un puntero al bloque de memoria. Si la asignación de memoria falla, se devuelve un puntero NULL. |
void * malloc (size_t size);
asigna tamaño
bytes de memoria. Si la asignación se realiza correctamente, se devuelve un puntero a la memoria asignada. De otra manera NULO
es regresado. Ejemplo:
/ * Asignar memoria para una matriz con 15 elementos de tipo En t. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * No se pudo asignar la memoria, así que imprima un error y salga. * / fprintf (stderr, "No se pudo asignar la memoria \ n"); exit (EXIT_FAILURE); / * La asignación tuvo éxito. * /
Tenga en cuenta que malloc
requiere que calculemos los bytes de memoria que necesitamos, y que pasemos eso como un argumento a malloc.
void * calloc (size_t nelements, size_t bytes);
asigna un bloque de memoria contiguo lo suficientemente grande como para contener nelementos
de tamaño bytes
cada. La región asignada se inicializa a cero. En el ejemplo anterior:
/ * Asignar espacio para una matriz con 15 elementos de tipo En t e inicializar a ceros. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * No se pudo asignar la memoria, así que imprima un error y salga. * / fprintf (stderr, "No se pudo asignar la memoria \ n"); exit (EXIT_FAILURE); / * La asignación tuvo éxito. * /
calloc (m, n) es lo mismo que
p = malloc (m * n); si (p) memset (p, 0, m * n);
Este video tutorial explica las funciones de asignación de memoria. malloc
, calloc
y realloc
, así como la función de desasignación de memoria gratis
:
Generalmente es una buena idea usar calloc
terminado malloc
. Cuando utiliza malloc, los contenidos de la memoria asignada son impredecibles. Los errores de programación pueden hacer que estos contenidos de memoria se filtren de manera involuntaria pero altamente vulnerable. Un buen ejemplo de tal filtración es la vulnerabilidad de Heartbleed en OpenSSL, cuyo mecanismo básico se explica en este cómic de XKCD y algunos detalles técnicos más se encuentran en esta publicación del blog..
calloc es un poquito más lento que malloc debido al paso adicional de inicializar la región de memoria asignada. Sin embargo, en la práctica, la diferencia de velocidad es muy pequeña y puede ignorarse..