NAME
reallocarray
,
recallocarray
—
memory reallocation
functions
LIBRARY
library “libc”
SYNOPSIS
#include
<stdlib.h>
void *
reallocarray
(void
*ptr, size_t
number, size_t
size);
void *
recallocarray
(void
*ptr, size_t
oldnmemb, size_t
nmemb, size_t
size);
DESCRIPTION
Thereallocarray
()
function is similar to the
realloc
()
function except it operates on number members of size
size and checks for integer overflow in the calculation
number * size.
The
recallocarray
()
function is similar to reallocarray
() except it
ensures newly allocated memory is cleared similar to
calloc
().
RETURN VALUES
The reallocarray
() function returns a
pointer to the allocated space; otherwise, a NULL
pointer is returned and errno is set to
ENOMEM
.
EXAMPLES
Consider reallocarray
() when there is
multiplication in the size argument of
malloc
() or realloc
(). For
example, avoid this common idiom as it may lead to integer overflow:
if ((p = malloc(num * size)) == NULL) err(1, "malloc");
A drop-in replacement is the OpenBSD
extension reallocarray
():
if ((p = reallocarray(NULL, num, size)) == NULL) err(1, "reallocarray");
When using realloc
(), be careful to avoid
the following idiom:
size += 50; if ((p = realloc(p, size)) == NULL) return (NULL);
Do not adjust the variable describing how much memory has been
allocated until the allocation has been successful. This can cause aberrant
program behavior if the incorrect size value is used. In most cases, the
above sample will also result in a leak of memory. As stated earlier, a
return value of NULL
indicates that the old object
still remains allocated. Better code looks like this:
newsize = size + 50; if ((newp = realloc(p, newsize)) == NULL) { free(p); p = NULL; size = 0; return (NULL); } p = newp; size = newsize;
As with malloc
(), it is important to
ensure the new size value will not overflow; i.e. avoid allocations like the
following:
if ((newp = realloc(p, num * size)) == NULL) { ...
Instead, use reallocarray
():
if ((newp = reallocarray(p, num, size)) == NULL) { ...
SEE ALSO
HISTORY
The reallocarray
() function first appeared
in OpenBSD 5.6 and DragonFly
5.5.
The recallocarray
() function appeared in
OpenBSD 6.1 and DragonFly
5.5.