You may need to expand or shrink your pointer storage space after you have allocated memory to it. The void *realloc(void *ptr, size_t size)
function deallocates the old object pointed to by ptr
and returns a pointer to an object that has the size specified by size
. ptr
is the pointer to a memory block previously allocated with malloc
, calloc
or realloc
(or a null pointer) to be reallocated. The maximal possible contents of the original memory is preserved. If the new size is larger, any additional memory beyond the old size are uninitialized. If the new size is shorter, the contents of the shrunken part is lost. If ptr
is NULL, a new block is allocated and a pointer to it is returned by the function.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p = malloc(10 * sizeof *p);
if (NULL == p)
{
perror("malloc() failed");
return EXIT_FAILURE;
}
p[0] = 42;
p[9] = 15;
/* Reallocate array to a larger size, storing the result into a
* temporary pointer in case realloc() fails. */
{
int *temporary = realloc(p, 1000000 * sizeof *temporary);
/* realloc() failed, the original allocation was not free'd yet. */
if (NULL == temporary)
{
perror("realloc() failed");
free(p); /* Clean up. */
return EXIT_FAILURE;
}
p = temporary;
}
/* From here on, array can be used with the new size it was
* realloc'ed to, until it is free'd. */
/* The values of p[0] to p[9] are preserved, so this will print:
42 15
*/
printf("%d %d\n", p[0], p[9]);
free(p);
return EXIT_SUCCESS;
}
The reallocated object may or may not have the same address as *p
. Therefore it is important to capture the return value from realloc
which contains the new address if the call is successful.
Make sure you assign the return value of realloc
to a temporary
instead of the original p
. realloc
will return null in case of any failure, which would overwrite the pointer. This would lose your data and create a memory leak.