calloc y realloc
Memoria puesta a cero y redimensionada
calloc y realloc es una lección gratuita de C Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.
Más allá de malloc
Además de malloc, la biblioteca estándar ofrece calloc para obtener memoria inicializada a cero y realloc para cambiar el tamaño de un bloque existente.
Ambas funciones se encuentran en <stdlib.h>.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = calloc(3, sizeof(int));
printf("%d %d %d\n", p[0], p[1], p[2]);
free(p);
return 0;
}calloc pone la memoria a cero
calloc(count, size) asigna espacio para count elementos de size bytes y establece cada byte en cero.
Es práctico cuando necesita empezar con un estado limpio.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = calloc(5, sizeof(int));
int sum = 0;
for (int i = 0; i < 5; i++) sum += a[i];
printf("sum of zeroed array = %d\n", sum);
free(a);
return 0;
}calloc tiene dos argumentos
A diferencia de malloc, calloc recibe por separado la cantidad de elementos y el tamaño de cada elemento.
Además, evita el desbordamiento al multiplicar la cantidad por el tamaño.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
double *d = calloc(4, sizeof(double));
d[2] = 1.5;
printf("%f %f\n", d[0], d[2]);
free(d);
return 0;
}malloc frente a calloc
Use malloc cuando vaya a sobrescribir todos los bytes de todos modos, y calloc cuando necesite que la memoria comience a cero.
calloc cuesta un poco más debido a la puesta a cero.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *m = malloc(2 * sizeof(int));
int *c = calloc(2, sizeof(int));
m[0] = 5; m[1] = 6;
printf("malloc: %d %d\n", m[0], m[1]);
printf("calloc: %d %d\n", c[0], c[1]);
free(m); free(c);
return 0;
}Ampliar con realloc
realloc(ptr, newsize) cambia el tamaño de un bloque y conserva su contenido existente hasta el menor de los tamaños antiguo y nuevo.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(2 * sizeof(int));
a[0] = 1; a[1] = 2;
a = realloc(a, 4 * sizeof(int));
a[2] = 3; a[3] = 4;
for (int i = 0; i < 4; i++) printf("%d ", a[i]);
printf("\n");
free(a);
return 0;
}realloc puede mover el bloque
realloc puede devolver una dirección diferente si reubica el bloque para encontrar espacio.
Asigne siempre el resultado y no siga usando el puntero antiguo.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(sizeof(int));
a[0] = 42;
int *bigger = realloc(a, 100 * sizeof(int));
printf("first element still %d\n", bigger[0]);
free(bigger);
return 0;
}Patrón seguro para realloc
Si realloc falla, devuelve NULL, pero deja intacto el bloque original.
Asigne primero el resultado a una variable temporal para no perder el puntero antiguo si se produce un error.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(2 * sizeof(int));
int *tmp = realloc(a, 8 * sizeof(int));
if (tmp == NULL) {
free(a);
return 1;
}
a = tmp;
a[7] = 99;
printf("%d\n", a[7]);
free(a);
return 0;
}Reducir un bloque
realloc también puede reducir un bloque. Los elementos iniciales se conservan; el resto se libera.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(6 * sizeof(int));
for (int i = 0; i < 6; i++) a[i] = i;
a = realloc(a, 3 * sizeof(int));
printf("%d %d %d\n", a[0], a[1], a[2]);
free(a);
return 0;
}Un búfer que crece
Un patrón habitual duplica la capacidad cuando un array se llena, distribuyendo el coste del crecimiento.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int cap = 2, len = 0;
int *a = malloc(cap * sizeof(int));
for (int v = 0; v < 5; v++) {
if (len == cap) {
cap *= 2;
a = realloc(a, cap * sizeof(int));
}
a[len++] = v;
}
printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
free(a);
return 0;
}realloc con NULL
realloc(NULL, size) se comporta exactamente como malloc(size).
Esto permite que una rutina de crecimiento gestione de forma uniforme la primera asignación.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = realloc(NULL, 3 * sizeof(int));
a[0] = 7;
printf("%d\n", a[0]);
free(a);
return 0;
}Combinarlas
Puede comenzar con calloc para obtener un búfer puesto a cero y ampliarlo más adelante con realloc. Los bytes nuevos después de una ampliación no se ponen a cero.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = calloc(2, sizeof(int));
a = realloc(a, 4 * sizeof(int));
a[2] = 0; a[3] = 0;
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
free(a);
return 0;
}Comprobación rápida
Compruebe sus conocimientos sobre calloc y realloc.
Resumen
Ha aprendido dos herramientas de asignación más:
calloc(count, size)asigna memoria puesta a cero y evita el desbordamiento de la multiplicación.realloc(ptr, newsize)cambia el tamaño de un bloque y puede moverlo.- Asigne siempre el resultado de realloc a una variable temporal para evitar fugas si se produce un error.
realloc(NULL, size)actúa como malloc.
Preguntas frecuentes
¿La lección «calloc y realloc» es gratis?
Sí — el texto completo de «calloc y realloc» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.
¿Qué aprenderé en «calloc y realloc»?
Memoria puesta a cero y redimensionada Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C Academy?
No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «calloc y realloc»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C Academy?
Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- malloc y free
- calloc y realloc
- Fugas de memoria
- Punteros colgantes