malloc vs calloc: Diferencias clave explicadas con ejemplos prácticos
¿Qué es la asignación dinámica de memoria?
La asignación dinámica de memoria permite a un programa solicitar y liberar memoria en tiempo de ejecución. En C, la biblioteca estándar proporciona cuatro funciones principales para este propósito: malloc(), calloc(), realloc() y free(), todas declaradas en stdlib.h.
malloc(): Asignar un único bloque de memoria
malloc() (abreviatura de "memory allocation") reserva un bloque contiguo de bytes y devuelve un puntero al primer byte. El contenido del bloque recién asignado es indeterminado, es decir, contiene los bits que sucedan a estar en esa ubicación de memoria.
Uso típico:
int *p = (int *)malloc(n * sizeof(int));Si la solicitud falla,
malloc() devuelve NULL.
calloc(): Asignar múltiples bloques inicializados a cero
calloc() (abreviatura de "contiguous allocation") toma dos argumentos: el número de elementos y el tamaño de cada elemento. Asigna memoria para todos los elementos y automáticamente establece cada byte a cero, lo que lo hace ideal para arrays o estructuras que necesitan un estado inicial limpio.
Uso típico:
int *p = (int *)calloc(n, sizeof(int));Al igual que
malloc(), devuelve NULL si la asignación falla.
Cuándo usar cada función
- malloc() – Úsalo cuando necesites un único bloque y planees inicializar la memoria tú mismo. Es ligeramente más rápido porque omite el paso de puesta a cero.
- calloc() – Úsalo cuando necesites un array o estructura que deba comenzar con todos los ceros. La inicialización automática protege contra el uso accidental de valores basura.
Resumen de sintaxis
malloc()
void *malloc(size_t size);
calloc()
void *calloc(size_t num, size_t size);
Ejemplos de código prácticos
Ejemplo 1: Usar malloc() para almacenar 15 enteros
#include <stdlib.h> #include <stdio.h> int main(void) { int *ptr = malloc(15 * sizeof(*ptr)); if (!ptr) { perror("malloc failed"); return EXIT_FAILURE; } ptr[5] = 480; // 6º elemento (índice 0-based) printf("Value of the 6th integer is %d\n", ptr[5]); free(ptr); return EXIT_SUCCESS; }
Salida: Value of the 6th integer is 480
Ejemplo 2: Usar calloc() para calcular una suma
#include <stdlib.h> #include <stdio.h> int main(void) { int *ptr = calloc(10, sizeof(int)); if (!ptr) { perror("calloc failed"); return EXIT_FAILURE; } int sum = 0; for (int i = 0; i < 10; ++i) { ptr[i] = i; // la inicialización es redundante pero se muestra por claridad sum += ptr[i]; } printf("Sum = %d\n", sum); free(ptr); return EXIT_SUCCESS; }
Salida: Sum = 45
Comparación lado a lado

| Característica | malloc() | calloc() |
|---|---|---|
| Número de parámetros | 1 (tamaño) | 2 (cuenta, tamaño) |
| Estado de memoria tras la asignación | Sin inicializar (basura) | Inicializado a cero |
| Caso de uso típico | Bloque único, inicialización manual | Arrays o estructuras que necesitan inicio limpio |
| Rendimiento | Más rápido (sin puesta a cero) | Más lento (overhead de puesta a cero) |
| Seguridad | Mayor riesgo de usar valores basura | Menor riesgo gracias a la puesta a cero automática |
| Valor de retorno en caso de fallo | NULL | NULL |
| Cabecera estándar | stdlib.h | stdlib.h |
Conclusiones clave
- Usa
malloc()cuando necesites un único bloque y lo inicialices tú mismo para una pequeña ganancia de rendimiento. - Usa
calloc()cuando requieras memoria inicializada a cero, especialmente para arrays o structs, para evitar bugs sutiles. - Ambas funciones devuelven
NULLen caso de fallo; comprueba siempre antes de desreferenciar. - Recuerda liberar la memoria asignada con
free()para evitar fugas.
Lenguaje C
- Expresiones, sentencias y bloques en C#: Guía completa con ejemplos prácticos
- Bucle do‑while en C++: Sintaxis, ejemplos prácticos y bucles anidados
- Dominando punteros en C++: Conceptos, ejemplos y aplicaciones prácticas
- Dominando el tipo de dato char en C++: Declaración, ASCII y técnicas de conversión
- Sobrecarga de operadores en C++: Guía práctica con ejemplos de código
- Funciones en C++ Explicadas con Ejemplos de Código Prácticos
- Dominando Colecciones en C#: Tutorial Práctico con Ejemplos del Mundo Real
- Bucles While vs. Do-While: Comparación clara con ejemplos prácticos
- calloc() en C: Asignación de memoria inicializada a cero y ejemplo práctico
- Domine str.count() en Python: Cómo Contar Caracteres y Subcadenas con Ejemplos
- Función round() en Python explicada con ejemplos prácticos