reallocarray.3bsd - Man Page

memory allocation and deallocation

Library

library “libbsd”

Synopsis

#include <stdlib.h> (See libbsd(7) for include usage.)
void *
reallocarray(void *ptr, size_t nmemb, size_t size);

Description

When using malloc() be careful to avoid the following idiom:

if ((p = malloc(num * size)) == NULL)
	err(1, "malloc");

The multiplication may lead to an integer overflow, which can be avoided using the extension reallocarray(), as follows:

if ((p = reallocarray(NULL, num, size)) == NULL)
	err(1, "malloc");

Alternatively calloc() is a more portable solution which comes with the cost of clearing memory.

If malloc() must be used, be sure to test for overflow:

if (size && num > SIZE_MAX / size) {
	errno = ENOMEM;
	err(1, "overflow");
}

The use of reallocarray() or calloc() is strongly encouraged when allocating multiple sized objects in order to avoid possible integer overflows.

Return Values

The reallocarray() function returns a pointer to the allocated space if successful; otherwise, a null pointer is returned and errno is set to ENOMEM.

See Also

malloc(3), calloc(3), alloca(3)

History

reallocarray() appeared in OpenBSD 5.6, glibc 2.26.

Info

May 1, 2014