REALLOCARR(3) | Library Functions Manual | REALLOCARR(3) |
reallocarr
—
#include <stdlib.h>
int
reallocarr
(void *ptrp,
size_t number, size_t size);
reallocarr
function safely allocates, resizes, or
frees arrays in memory.
If ptr is a null pointer, or a pointer to
memory previously allocated with reallocarr
, then
reallocarr
(&
ptr,
number, size); allocates or
reallocates the memory that ptr points to, possibly
moving it to a different location in memory, so that it has space for an
array of number elements of size
bytes apiece. reallocarr
updates
ptr in case it was moved on success, and leaves it
unchanged on failure.
If ptr was previously allocated, the objects
stored at ptr[0]
,
ptr[1]
, ..., up to the shorter
of its old number and its new
number, are copied into the new memory, like
realloc(3).
ptr may be null and number may be zero. size must be nonzero.
The memory allocated by reallocarr
may be
freed with
reallocarr
(&
ptr,
0
, size);, which will always
succeed and unconditionally set ptr to null.
Like calloc(3),
reallocarr
fails gracefully if the product of
number and size would overflow
the representable size of memory. Unlike
calloc(3), new memory
allocated by reallocarr
is not zero-initialized.
The reallocarr
function may alter
errno as a side effect.
Note that the argument ptrp is a pointer to a pointer to allocated memory, unlike realloc(3) which takes a pointer to allocated memory.
reallocarr
returns 0 and
updates ptr. Otherwise, an
errno(2) is returned, and
ptr and the memory it points to are unmodified.
reallocarr
() to initialize an array
of INITSIZE
integers, then resizes it to
NEWSIZE
elements, and finally frees it:
int *data = NULL; int error = 0; /* allocate */ error = reallocarr(&data, INITSIZE, sizeof(*data)); if (error) errc(1, error, "reallocarr failed"); ... /* resize */ error = reallocarr(&data, NEWSIZE, sizeof(*data)); if (error) errc(1, error, "reallocarr failed on resize"); ... /* free */ (void)reallocarr(&data, 0, sizeof(*data)); assert(data == NULL);
reallocarr
first appeared in NetBSD
7.0. OpenBSD introduced the
reallocarray(3) function
for the same purpose, but the interface makes it difficult to correctly handle
zero-sized allocations.
August 31, 2022 | NetBSD 10.0 |