Uso de realloc() en C: Sintaxis, mejores prácticas y ejemplo
¿Qué es realloc()?
realloc() es una función de la biblioteca estándar de C que redimensiona un bloque de memoria existente. Lo expande o reduce preservando su contenido. Esto hace que la gestión dinámica de memoria sea más eficiente, especialmente cuando el tamaño requerido cambia durante la ejecución.
Sintaxis
ptr = realloc(ptr, newSize);
Aquí, ptr apunta a un bloque asignado previamente y newSize es el tamaño deseado en bytes. Tras la llamada, ptr apuntará al primer byte del nuevo bloque. La función copia los datos originales a la nueva ubicación y libera el bloque antiguo si la reasignación tiene éxito.
Puntos clave a recordar
- Cuando
realloc()tiene éxito, el puntero devuelto puede ser el mismo que el original o una nueva dirección. - Si la función falla, devuelve
NULLy deja el bloque original intacto. - Asigna siempre el resultado a un puntero temporal para evitar perder la dirección original en caso de fallo.
- Tras una reasignación exitosa, libera el puntero solo una vez.
Ejemplo – Redimensionar un buffer de cadena
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *buf = malloc(10); if (!buf) { perror("malloc"); return EXIT_FAILURE; } strcpy(buf, "Programming"); printf("%s\n", buf); char *tmp = realloc(buf, 20); // aumenta el tamaño del buffer if (!tmp) { free(buf); // el bloque original sigue válido perror("realloc"); return EXIT_FAILURE; } buf = tmp; strcat(buf, " in C"); printf("%s\n", buf); free(buf); return EXIT_SUCCESS; }
Ejemplo – Asignar y redimensionar un array de enteros
#include <stdio.h> #include <stdlib.h> int main(void) { int *arr = malloc(10 * sizeof(int)); if (!arr) { perror("malloc"); return EXIT_FAILURE; } /* ... usar el array ... */ int *tmp = realloc(arr, 50 * sizeof(int)); if (!tmp) { free(arr); perror("realloc"); return EXIT_FAILURE; } arr = tmp; printf("Array resized successfully\n"); free(arr); return EXIT_SUCCESS; }
Consejos prácticos
- Prefiere
size_tpara los argumentos de tamaño para evitar bugs relacionados con signos. - Al reducir un bloque, ten en cuenta que los datos más allá del nuevo tamaño se descartan.
- Comprueba siempre el valor de retorno antes de usar el puntero.
- Usa
free()exactamente una vez por cada asignación exitosa.
Lenguaje C
- Guía esencial: Cuándo y cómo usar un extintor de incendios de forma segura
- Dominando las pistolas de pintura: Guía profesional para cobertura uniforme y segura
- Uso Fácil de Termistor: Guía Paso a Paso con Arduino
- Dominando las Técnicas de Afiladora de Herramientas: Guía Práctica
- Aprovechando Azure DevOps: prácticas probadas para entrega acelerada
- Cómo el molibdeno moldea la industria moderna: usos, beneficios y dinámica de suministro
- Convierte tu rompecabezas terminado en una obra maestra atemporal con resina epoxi
- calloc() en C: Asignación de memoria inicializada a cero y ejemplo práctico
- Dominando la función free() en C: Guía práctica y ejemplo
- Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
- Dominando funciones VHDL: Guía práctica para diseño eficiente