Calloc vs. malloc

Calloc vs. malloc

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 - Gráfico de comparación de calloc versus malloc
callocmalloc
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.