Recomendado, 2024

La Elección Del Editor

Diferencia entre malloc y calloc

La diferencia fundamental entre las funciones malloc y calloc es que calloc () necesita dos argumentos en lugar de un argumento que es requerido por malloc () . Tanto malloc () como calloc () son las funciones que el lenguaje de programación C proporciona para la asignación dinámica de memoria y la desasignación en tiempo de ejecución.

Antes de comprender las funciones malloc () y calloc (), primero entendamos el significado de la asignación de memoria dinámica. La asignación de memoria es el procedimiento de asignación de la memoria de la computadora para la ejecución de programas y procesos. Usamos técnicas de asignación dinámica cuando no se sabe antes cuánto espacio de memoria se necesita para el programa y el proceso.

La asignación de memoria dinámica surge debido a los problemas asociados con la asignación de memoria estática, por ejemplo, si se almacenan menos elementos, entonces el resto de la memoria se desperdicia innecesariamente. Por lo tanto, supera los problemas de la asignación de memoria estática donde la memoria se asigna solo cuando es necesaria.

Gráfica comparativa

Bases de comparaciónmalloc ()calloc ()
No de bloquesAsigna bloque único de memoria demandada.
Asigna múltiples bloques de la memoria solicitada.
Sintaxisvoid * malloc (size_t size);void * calloc (size_t num, size_t size);
Inicializaciónmalloc () no borra e inicializa la memoria asignada.La memoria asignada se inicializa a cero utilizando calloc ().
Forma de asignaciónLa función malloc () asigna memoria de tamaño 'tamaño' del montón.La función calloc () asigna memoria cuyo tamaño es igual al tamaño num *.
VelocidadRápidoComparativamente lento.

Definición de malloc ()

La función malloc asigna un bloque de memoria en bytes . El usuario debe dar explícitamente el tamaño de bloque, requiere para el uso.

A través de la función malloc, el programa solicita la RAM del sistema para la asignación de la memoria, si la solicitud se concede (es decir, la función malloc dice que tiene éxito en la asignación de memoria), devuelve un puntero al primer bloque de memoria. Devuelve un tipo de puntero vacío, lo que significa que se puede asignar cualquier tipo de puntero.

Aunque, devuelve un valor NULL, si el malloc funciona no puede asignar la cantidad de memoria requerida. Se puede acceder a la función malloc en TURBO C, archivo de cabecera alloc.h o stdlib.h, y en UNIX estará disponible en el archivo de cabecera .

SINTAXIS

La sintaxis de esta función es la siguiente:

malloc(number of elements * size of each element);

por ejemplo,
int *ptr;
ptr=malloc(10*sizeof (int))

Donde tamaño representa el tamaño de la memoria requerida en bytes (es decir, el número de ubicaciones de memoria contiguas que se asignarán).

Pero como se mencionó anteriormente, la función malloc devuelve un puntero nulo, por lo tanto, se requiere que un operador de conversión cambie el tipo de puntero devuelto en función de nuestra necesidad, la declaración anterior podría presentarse en la siguiente forma:

ptr_var=(type_cast* ) malloc (size)

Donde ptr_var es el nombre del puntero que conserva la dirección de inicio del bloque de memoria asignado, type_cast es el tipo de datos en el que se va a transformar el puntero devuelto (o tipo void), y el tamaño describe el tamaño del bloque de memoria asignado en bytes .

Por ejemplo:
int *ptr;
ptr=(int*) malloc (10 * size of (int));

La memoria asignada por la función malloc contiene valor de basura .

Tenga en cuenta que para verificar que si malloc genera la solicitud correspondiente para asignar la memoria otorgada por la RAM del sistema, o si se rechaza (en caso de que no haya espacio disponible, no está disponible). Podemos hacer uso de la propiedad en la que no se asigna la cantidad necesaria de memoria, la función malloc devuelve un valor NULL.

Definición de calloc ()

La función calloc opera exactamente igual que la función malloc, excluyendo el hecho de que requiere dos argumentos, ya que en el caso de malloc () solo se necesita un argumento.

Por ejemplo:
int*ptr;
ptr = (int*)calloc(10, 2);

Aquí 2 especifica el tamaño del tipo de datos en un byte para el que queremos que se realice la asignación, que en este caso es 2 para los enteros. Y 10 significa el número de elementos para los cuales se realizará la asignación.

Recuerde que el argumento pasado a la función malloc era (n * 10), es un argumento único que no debe confundirse porque los argumentos múltiples siempre están separados por comas. El argumento (n * 10) no tiene comas en el medio. Por lo tanto, es un argumento único, aunque no simple, sino una expresión.

Volviendo a la declaración anterior, después de la ejecución de la declaración anterior, se asigna un bloque de memoria de 20 bytes al programa solicitante y la dirección del primer bloque se asigna al programa solicitante, y la dirección del primer bloque se asigna al puntero ptr.

La memoria asignada por la función calloc contiene todos los ceros. La función calloc también se puede obtener en el archivo de encabezado o en TURBO C.

Diferencias clave entre malloc y calloc

Las principales diferencias entre las funciones malloc y calloc son:

  1. Un bloque único de memoria solicitada se asigna en malloc mientras que los bloques múltiples de memoria solicitada son asignados por calloc.
  2. La función malloc no borra e inicializa la memoria asignada. Contiene el valor de basura y el elemento de la memoria asignada no se puede modificar. Por el contrario, calloc inicializa la memoria asignada a cero.
  3. malloc es más rápido que el calloc debido al requisito de pasos adicionales de inicialización en el calloc, pero la diferencia es insignificante.
  4. Otra diferencia entre estos dos es que calloc es un malloc + memset, memset asigna las páginas físicas en la memoria, mientras que malloc solo asigna la memoria del montón en la dirección virtual.

Conclusión:

Las funciones malloc y calloc se utilizan para la asignación de la memoria y tienen su cierta ventaja, y la desventaja de que malloc es rápida en comparación con calloc. Además, malloc es más fácil de usar, ya que solo toma un argumento porque calloc asigna memoria e inicializa el área de memoria con CERO. Pero preferiría usar calloc cuando la inicialización de variables es más importante para usted.

Top