Función de la biblioteca C -realloc()
Biblioteca estándar de C - <stdlib.h>
realloc() es una función de la biblioteca estándar de C que se utiliza para reasignar espacio de memoria. Es muy importante en la gestión dinámica de memoria, especialmente cuando se necesita ajustar el tamaño de la memoria ya asignada.
Función de la biblioteca Cvoid *realloc(void *ptr, size_t size)Intenta reajustar el tamaño del bloque de memoria previamente asignado mediante la llamada amallococallocasignado porptrel tamaño del bloque de memoria al que apunta.
Declaración
La siguiente es la declaración de la función realloc():
void *realloc(void *ptr, size_t size)
Parámetros
- ptr-- Puntero a un bloque de memoria que se va a reasignar. Dicho bloque de memoria fue asignado previamente mediante la llamada a malloc, calloc o realloc. Si es un puntero nulo, se asignará un nuevo bloque de memoria y la función devolverá un puntero que apunta a él.
- size-- El nuevo tamaño del bloque de memoria, en bytes. Si el tamaño es 0 y ptr apunta a un bloque de memoria existente, el bloque de memoria al que apunta ptr será liberado y se devolverá un puntero nulo.
Valor de retorno
- Si tiene éxito,
realloc()devuelve un puntero al nuevo bloque de memoria. - Si falla, devuelve
NULLNULL, y el bloque de memoria original permanece sin cambios (no se libera).
Instrucciones de uso
realloc()Puede mover el bloque de memoria a una nueva ubicación (si no hay suficiente espacio en la ubicación original para acomodar el nuevo tamaño). Si el movimiento tiene éxito,ptrel puntero apuntará a la nueva ubicación. Se debe prestar especial atención: el antiguoptrpuntero debe actualizarse a larealloc()nueva dirección devuelta por realloc().- Si la asignación de memoria falla,
realloc()devuelveNULLNULL, mientras que el bloque de memoria original no se libera. Para evitar fugas de memoria, se debe utilizar un puntero temporal para recibir elrealloc()valor de retorno de realloc(), y comprobar si esNULL。
Ejemplo
El siguiente ejemplo demuestra el uso de la función realloc().
Ejemplo 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
/*Asignación de memoria inicial*/
str = (char *) malloc(15);
strcpy(str, "ejemplo");
printf("String = %s, Address = %p\n", str, str);
/*Reasignación de memoria*/
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s, Address = %p\n", str, str);
free(str);
return(0);
}
Compilemos y ejecutemos el programa anterior, esto producirá el siguiente resultado:
String = ejemplo, Address = 0x7fa2f8c02b10 String = example.com, Address = 0x7fa2f8c02b10
Ejemplo 2
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = malloc(5 * sizeof(int)); // Asignar memoria para 5 enteros
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Rellenar el array
for (int i = 0; i < 5; i++) {
arr[i] = i * 2;
}
// Reasignar memoria, ajustar al tamaño de 10 enteros
int *new_arr = realloc(arr, 10 * sizeof(int));
if (new_arr == NULL) {
printf("Reallocation failed\n");
free(arr); // Liberar la memoria original en caso de fallo
return 1;
}
// Rellenar la nueva parte
for (int i = 5; i < 10; i++) {
new_arr[i] = i * 2;
}
// Imprimir el nuevo array
for (int i = 0; i < 10; i++) {
printf("%d ", new_arr[i]);
}
free(new_arr); // Finalmente liberar la memoria
return 0;
}
#include <stdlib.h>
int main() {
int *arr = malloc(5 * sizeof(int)); // Asignar memoria para 5 enteros
if (arr == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// Rellenar el array
for (int i = 0; i < 5; i++) {
arr[i] = i * 2;
}
// Reasignar memoria, ajustar al tamaño de 10 enteros
int *new_arr = realloc(arr, 10 * sizeof(int));
if (new_arr == NULL) {
printf("Reallocation failed\n");
free(arr); // Liberar la memoria original en caso de fallo
return 1;
}
// Rellenar la nueva parte
for (int i = 5; i < 10; i++) {
new_arr[i] = i * 2;
}
// Imprimir el nuevo array
for (int i = 0; i < 10; i++) {
printf("%d ", new_arr[i]);
}
free(new_arr); // Finalmente liberar la memoria
return 0;
}
Notas
- Comprobar el valor de retorno: compruebe siempre el
realloc()valor de retorno de realloc(). Si devuelveNULLNULL, no descarte directamente el puntero original. - Fuga de memoria: si
realloc()realloc() devuelveNULLNULL, el bloque de memoria original no se libera. En este caso, debe liberar la memoria original y manejar la situación de error. - Puntero no válido: si usa directamente el puntero original para recibir el
realloc()nuevo puntero devuelto por realloc(), puede provocar fugas de memoria, especialmente cuandorealloc()realloc() falla. Por lo tanto, normalmente se usa primero un puntero temporal para recibir el valor de retorno.
Usos comunes
- Expandir dinámicamente el tamaño de arrays u otras estructuras de datos.
- Se utiliza para manejar conjuntos de datos de tamaño variable en tiempo de ejecución, como listas, cadenas o cachés generados dinámicamente.