Espacios de nombres
Variantes
Acciones

realloc

De cppreference.com
< c‎ | memory
Definido en la cabecera <stdlib.h>
void *realloc( void *ptr, size_t nuevo_tamaño );

Reasigna el área de memoria dada. Debe ser asignado previamente por malloc(), calloc() o realloc() y aún no ser liberado con una llamada a free o realloc. De lo contrario, el resultado es indefinido.

La reasignación es hecha por alguno de ambos:

a) expandir o contraer el área existente apuntada por ptr, si es posible. El contenido del área permanece inalterado hasta el mínimo de los tamaños nuevos y antiguos. Si el área se expande, el contenido de la nueva parte del arreglo es indefinido.
b) asignando un nuevo bloque de memoria de nuevo_tamaño de bytes, copiando un área de memoria con un tamaño igual al menor de los nuevos y viejos tamaños, y liberando el bloque viejo.

Si no hay suficiente memoria, el viejo bloque de memoria no se libera y se devuelve un puntero nulo.

Si ptr es NULL, el comportamiento es el mismo que llamar malloc(nuevo_tamaño).

Si nuevo_tamaño es cero, el comportamiento está definido por la implementación (el puntero nulo puede ser devuelto (en cuyo caso el viejo bloque de memoria puede o no ser liberado), o puede ser devuelto algún puntero no nulo que no pueda ser usado para acceder al almacenamiento).

realloc es seguro para los hilos: se comporta como si sólo accediera a las posiciones de memoria visibles a través de su argumento, y no a cualquier almacenamiento estático.

Una llamada previa a free o realloc que desasigna una región de memoria se sincroniza con una llamada a cualquier función de asignación, incluyendo realloc que asigna la misma o parte de la misma región de memoria. Esta sincronización se produce después de cualquier acceso a la memoria por parte de la función de desasignación y antes de cualquier acceso a la memoria por parte de realloc. Hay un solo orden total de todas las funciones de asignación y desasignación que operan en cada región particular de la memoria.

(desde C11)

Contenido

[editar] Parametros

ptr - puntero a la memoria a ser reasignada
nuevo_tamaño - nuvo tamaño del arreglo en bytes

[editar] Valor de retorno

En caso de éxito, devuelve el puntero al principio de la nueva memoria asignada. Para evitar una fuga de memoria, el puntero devuelto debe estar desasignado con free() o realloc(). El puntero original ptr se invalida y cualquier acceso a él es un comportamiento indefinido (incluso si la reasignación estaba en el lugar).

En caso de fallo, devuelve un puntero nulo. El puntero original ptr sigue siendo válido y puede necesitar ser desasignado con free() o realloc().

[editar] Observaciones

El soporte para el tamaño cero es obsoleto a partir de C11 DR 400.

Originalmente (en C89), se agregó soporte para el tamaño cero para acomodar códigos tales como

OBJ *p = calloc(0, sizeof(OBJ)); // marcador de "longitud cero"
...
while(1) { 
    p = realloc(p, c * sizeof(OBJ)); // sigue reasignando hasta que el tamaño se ajuste
    ... // el código que puede cambiar c o salir del bucle
}

[editar] Ejemplo

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *pa = malloc(10 * sizeof *pa); // asignar un arreglo de 10 int
    if(pa) {
        printf("%zu bytes asignados. Enteros almacenados: ", 10*sizeof(int));
        for(int n = 0; n < 10; ++n)
            printf("%d ", pa[n] = n);
    }
 
    int *pb = realloc(pa, 1000000 * sizeof *pb); // reasigna el arreglo a un tamaño mayor
    if(pb) {
        printf("\n%zu bytes asignados, los primeros diez enteros son: ", 1000000*sizeof(int));
        for(int n = 0; n < 10; ++n)
            printf("%d ", pb[n]); // imprime el arreglo
        free(pb);
    } else { // si la reasignación falla, el puntero original debe ser liberado.
        free(pa);
    }
}

Salida:

40 bytes asignados. Enteros almacenados: 0 1 2 3 4 5 6 7 8 9
4000000 bytes asignados, los primeros diez enteros son: 0 1 2 3 4 5 6 7 8 9

[editar] Referencias

  • Standard C11 (ISO/IEC 9899:2011):
  • 7.22.3.5 The realloc function (p: 349)
  • Standard C99 (ISO/IEC 9899:1999):
  • 7.20.3.4 The realloc function (p: 314)
  • Standard C89/C90 (ISO/IEC 9899:1990):
  • 4.10.3.4 The realloc function

[editar] Véase también