calloc vs. malloc

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..

Gráfica comparativa

Gráfico comparativo 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 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.

Contenido: calloc vs. malloc.

  • 1 Sintaxis y ejemplos
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Video Explicando Calloc, Malloc, y Realloc
  • 3 consideraciones de seguridad
  • 4 velocidad de ejecución
  • 5 referencias

Sintaxis y ejemplos

malloc ()

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.

calloc ()

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); 

Video que explica Calloc, Malloc, y Realloc

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:

Consideraciones de Seguridad

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..

Velocidad de ejecución

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..

Referencias

  • calloc página de manual
  • malloc página de manual