Changing Block Size - The GNU C Library

Next: Allocating Cleared Space, Previous: Freeing after Malloc, Up: Unconstrained Allocation

##### 3.2.2.4 Changing the Size of a Block

Often you do not know for certain how big a block you will ultimately need at the time you must begin to use the block. For example, the block might be a buffer that you use to hold a line being read from a file; no matter how long you make the buffer initially, you may encounter a line that is longer.

You can make the block longer by calling `realloc`. This function is declared in `stdlib.h`.

— Function: void * realloc (void *ptr, size_t newsize)

> The `realloc` function changes the size of the block whose address is ptr to be newsize.

> Since the space after the end of the block may be in use, `realloc` may find it necessary to copy the block to a new address where more free space is available. The value of `realloc` is the new address of the block. If the block needs to be moved, `realloc` copies the old contents.

> If you pass a null pointer for ptr, `realloc` behaves just like ‘`malloc (newsize)`’. This can be convenient, but beware that older implementations (before ISO C) may not support this behavior, and will probably crash when `realloc` is passed a null pointer.

Like `malloc`, `realloc` may return a null pointer if no memory space is available to make the block bigger. When this happens, the original block is untouched; it has not been modified or relocated.

In most cases it makes no difference what happens to the original block when `realloc` fails, because the application program cannot continue when it is out of memory, and the only thing to do is to give a fatal error message. Often it is convenient to write and use a subroutine, conventionally called `xrealloc`, that takes care of the error message as `xmalloc` does for `malloc`:

         void *
         xrealloc (void *ptr, size_t size)
         {
           register void *value = realloc (ptr, size);
           if (value == 0)
             fatal ("Virtual memory exhausted");
           return value;
         }

You can also use `realloc` to make a block smaller. The reason you would do this is to avoid tying up a lot of memory space when only a little is needed. In several allocation implementations, making a block smaller sometimes necessitates copying it, so it can fail if no other space is available.

If the new size you specify is the same as the old size, `realloc` is guaranteed to change nothing and return the same address that you gave.