realloc
trabaja detrás de las escenas más o menos así:
- si hay suficiente espacio libre detrás del bloque actual para cumplir con la solicitud, extender el bloque actual y devolver un puntero al comienzo del bloque .
- Si existe un bloque libre lo suficientemente grande en otro lugar, asigne ese bloque, copie los datos del bloque anterior, libere el bloque anterior y devuelva un puntero al principio del nuevo bloque
- Error de informe por devolviendo
NULL
.
Por lo tanto, se puede probar por falta de pruebas para NULL
, pero tenga en cuenta que no sobrescribir la antigua puntero demasiado pronto:
int* p = malloc(x);
/* ... */
p = realloc(p, y); /* WRONG: Old pointer lost if realloc fails: memory leak! */
/* Correct way: */
{
int* temp = realloc(p, y);
if (NULL == temp)
{
/* Handle error; p is still valid */
}
else
{
/* p now possibly points to deallocated memory. Overwrite it with the pointer
to the new block, to start using that */
p = temp;
}
}
¿Es esto el 'realloc' funciona para todas las implementaciones? –
@CoolGuy: es posible que algunas implementaciones (no puedan) hacer ese primer paso para extender el bloque actual, pero de lo contrario este es el comportamiento observable de 'realloc' para todas las implementaciones. –