Aumentar con realloc
Cambie el tamaño de un array dinámico
Aumentar con 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.
Cuando un malloc no es suficiente
A veces reserva un array, lo rellena y después descubre que necesita más espacio. No puede escribir simplemente más allá del final.
realloc le permite cambiar el tamaño de un bloque existente del heap conservando los datos que ya contenía.
La firma de realloc
realloc(ptr, new_bytes) recibe el puntero anterior y el nuevo tamaño total en bytes.
Devuelve un puntero a un bloque del nuevo tamaño. La primera parte de los datos se conserva hasta el menor de los tamaños antiguo y nuevo.
int *bigger = realloc(a, new_n * sizeof(*a));El bloque puede cambiar de ubicación
realloc puede ampliar el bloque en su ubicación actual o reservar un bloque nuevo, copiar sus datos y liberar el antiguo.
En ambos casos, el puntero anterior puede dejar de ser válido. A partir de ese momento, debe utilizar el puntero devuelto.
a = realloc(a, new_n * sizeof(*a));
/* the old value of a may no longer be valid */El riesgo de asignarse a sí mismo
Escribir a = realloc(a, ...) parece ordenado, pero es peligroso: si realloc devuelve NULL, habrá sobrescrito a y perdido el puntero original, dejando el bloque antiguo sin liberar.
Utilice una variable temporal en su lugar.
int *tmp = realloc(a, new_n * sizeof(*a));
if (tmp == NULL) { /* a is still valid */ return 1; }
a = tmp;Ampliar un array de forma segura
Este programa reserva espacio para 3 enteros y después lo amplía a 6 con realloc, conservando los tres primeros valores.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(3 * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < 3; i++) a[i] = i + 1;
int *tmp = realloc(a, 6 * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
for (int i = 3; i < 6; i++) a[i] = i + 1;
for (int i = 0; i < 6; i++) printf("%d\n", a[i]);
free(a);
return 0;
}Los bytes nuevos no están inicializados
Al ampliar un bloque, el espacio adicional del final contiene datos residuales, igual que la memoria recién obtenida con malloc.
realloc conserva los datos antiguos, pero no pone a cero la región nueva. Inicialícela antes de leerla.
a = realloc(a, 6 * sizeof(*a));
for (int i = 3; i < 6; i++) a[i] = 0; /* clear new slots */La estrategia de duplicación
Llamar a realloc por cada elemento individual es lento. Un truco clásico consiste en duplicar la capacidad cada vez que se queda sin espacio.
Así se mantiene reducido el número de realojamientos a medida que crece el array, lo que proporciona un buen rendimiento medio.
if (count == cap) {
cap = cap ? cap * 2 : 4;
int *tmp = realloc(a, cap * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
}Construir un array mediante anexiones
Este programa comienza vacío y añade números, duplicando la capacidad según sea necesario.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = NULL;
size_t count = 0, cap = 0;
for (int v = 1; v <= 5; v++) {
if (count == cap) {
cap = cap ? cap * 2 : 2;
int *tmp = realloc(a, cap * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
}
a[count++] = v;
}
for (size_t i = 0; i < count; i++) printf("%d\n", a[i]);
free(a);
return 0;
}realloc(NULL, n) actúa como malloc
Si pasa NULL como puntero, realloc se comporta exactamente como malloc.
Por eso comenzar con a = NULL funciona en el bucle de duplicación: la primera llamada a realloc reserva el bloque inicial.
int *a = NULL;
a = realloc(a, 4 * sizeof(*a)); /* same as malloc(4 * sizeof(*a)) */Reducir el tamaño de un bloque
realloc también puede reducir el tamaño de un bloque. Se conservan los datos hasta el nuevo tamaño y el resto se descarta.
Reducir el tamaño puede devolver memoria al sistema, aunque las implementaciones tienen libertad para conservar el bloque más grande.
int *tmp = realloc(a, 2 * sizeof(*a)); /* down from more */
if (tmp) a = tmp;Evite el desbordamiento en las operaciones matemáticas
Cuando la capacidad crece mucho, cap * sizeof(*a) podría desbordar un size_t y envolver su valor hasta convertirse en un número diminuto.
Para arrays enormes, proteja la multiplicación o use reallocarray en los sistemas que lo proporcionen.
if (cap > SIZE_MAX / sizeof(*a)) { /* overflow */ return 1; }
int *tmp = realloc(a, cap * sizeof(*a));Comprobación rápida
Compruebe su comprensión de realloc.
Resumen
realloc cambia el tamaño de un bloque del heap y puede moverlo, así que use siempre el puntero devuelto.
Asigne el resultado a una variable temporal para que un fallo no provoque la pérdida del bloque original. Duplique la capacidad para mejorar la velocidad, inicialice las nuevas posiciones y recuerde que realloc(NULL, n) equivale a malloc. A continuación, encapsulará esta lógica en un tipo vector reutilizable.
Preguntas frecuentes
¿La lección «Aumentar con realloc» es gratis?
Sí — el texto completo de «Aumentar con 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 «Aumentar con realloc»?
Cambie el tamaño de un array dinámico 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 «Aumentar con 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
- Asignar un array
- Aumentar con realloc
- Un tipo de vector reutilizable
- Liberar memoria y evitar fugas