Calloc vs. malloc
- 2495
- 292
- Teresa Sánchez
Cuando calloc se usa para asignar un bloque de memoria, la región asignada se inicializa a ceros. A diferencia de, malloc no toca el contenido del bloque asignado de memoria, lo que significa que contiene valores de basura. Esto podría ser un riesgo de seguridad porque el contenido de la memoria es impredecible y los errores de programación pueden dar lugar a una fuga de estos contenidos.
Cuadro comparativo
Diferencias - similitudes -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 el contenido de la memoria a los ceros. | asigna bytes de "tamaño" 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); |
Contenido de la memoria asignada | La región asignada se inicializa a cero. | El contenido de la memoria asignada no se cambia. i.mi., La memoria contiene valores impredecibles o de basura. Esto presenta un riesgo. |
Valor de retorno | Pointer vacío (void *). Si la asignación tiene éxito, se devuelve un puntero al bloque de memoria. Si la asignación de memoria falla, se devuelve un puntero nulo. | Pointer vacío (void *). Si la asignación tiene éxito, se devuelve un puntero al bloque de memoria. Si la asignación de memoria falla, se devuelve un puntero nulo. |
Sintaxis y ejemplos
malloc ()
void *malloc (size_t size);
asignar tamaño
bytes de memoria. Si la asignación tiene éxito, se devuelve un puntero a la memoria asignada. De lo contrario 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 memoria, así que imprima un error y salga. */ fprintf (stderr, "no se pudo asignar memoria \ n"); salida (exit_failure); /* Asignación tuvo éxito. */
Tenga en cuenta que malloc
requiere que calculemos los bytes de la memoria que necesitamos y lo pasemos como argumento a Malloc.
calloc ()
void *calloc (size_t nelements, size_t bytes);
asigna un bloque contiguo de memoria lo suficientemente grande como para sostener 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 inicializarse a ceros. */ int *ptr = calloc (15, sizeof (int)); if (ptr == null) /* no se pudo asignar memoria, así que imprima un error y salga. */ fprintf (stderr, "no se pudo asignar memoria \ n"); salida (exit_failure); /* Asignación tuvo éxito. */
calloc (m, n) es lo mismo que
p = malloc (m * n); if (p) memset (p, 0, m * n);
Video que explica Calloc, Malloc y RealLoc
Este video tutorial explica las funciones de asignación de memoria malloc
, calloc
y reasignar
, así como la función de desactivación de memoria gratis
:
Consideraciones de Seguridad
Generalmente es una buena idea usar calloc
encima malloc
. Cuando usa Malloc, el contenido de la memoria asignada es impredecible. Los errores de programación pueden hacer que estos contenidos de la memoria se filtren de maneras no intencionadas pero altamente vulnerables. Un buen ejemplo de tal fuga es la vulnerabilidad del corazón en OpenSSL, cuyo mecanismo básico se explica en este cómic XKCD y algunos detalles más técnicos están en esta publicación de blog.
Velocidad de ejecución
Calloc es un poco 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 en la velocidad es muy pequeña y se puede ignorar.