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.