Previous Page
Next Page

realloc

Resizes an allocated memory block

#include <stdlib.h>
void *realloc ( void *ptr , size_t n  );

The realloc( ) function replaces a memory block dynamically allocated by malloc( ), calloc( ) or realloc( ) with a new one of size n, and copies the contents of the previous block to the new block, to the extent that the two blocks' sizes permit. If the new block is larger, the values of the remaining bytes are undetermined. The pointer argument passed to realloc( ) is the address of the block previously allocated, and the function's return value is the address of the new block. The new block may or may not begin at the same address as the old block. realloc( ) returns a null pointer if the new block could not be allocated as requested; in this case, it does not release the old block, and your program can continue using it.

If the first argument is a null pointer, realloc( ) allocates a new memory block, behaving similarly to malloc( ). Otherwise, if the pointer argument does not point to a memory block allocated by malloc( ), calloc( ), or realloc( ), or if it points to such a block that has since been released by a call to free( ) or realloc( ), then the behavior is undefined.

Example

typedef struct { int len;
                 float array[ ];
               } DynArray_t;

DynArray_t *daPtr = malloc( sizeof(DynArray_t) + 10*sizeof(float) );
if ( daPtr == NULL ) exit -1;

daPtr->len = 10;

for ( int i = 0; i < daPtr->len; ++i )
  daPtr->array[i] = 1.0F/(i+1);
/* daPtr->array[10] = 0.1F             // Invalid array index! */

DynArray_t *daResizePtr = realloc( daPtr,
                                   sizeof(DynArray_t ) + 11*sizeof(float) );
if ( daResizePtr != NULL )
{
  daPtr = daResizePtr ;
  daPtr->len = 11;
  daPtr->array[10] = 0.1F / 12;        // Okay now.
}
else
  /* We'll just have to get along with the array of 10 floats. */

See Also

malloc( ), calloc( ), free( )


Previous Page
Next Page