.\" $NetBSD: reallocarr.3,v 1.7 2022/08/31 12:18:41 riastradh Exp $ .\" .\" Copyright (c) 2015 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in .\" the documentation and/or other materials provided with the .\" distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT .\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS .\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE .\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, .\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, .\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; .\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED .\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, .\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .Dd August 31, 2022 .Dt REALLOCARR 3 .Os .Sh NAME .Nm reallocarr .Nd reallocate array .Sh SYNOPSIS .In stdlib.h .Ft int .Fo reallocarr .Fa "void *ptrp" .Fa "size_t number" .Fa "size_t size" .Fc .Sh DESCRIPTION The .Nm function safely allocates, resizes, or frees arrays in memory. .Pp If .Fa ptr is a null pointer, or a pointer to memory previously allocated with .Nm , then .Fo reallocarr .Li & Ns Fa ptr , .Fa number , .Fa size .Fc allocates or reallocates the memory that .Fa ptr points to, possibly moving it to a different location in memory, so that it has space for an array of .Fa number elements of .Fa size bytes apiece. .Nm updates .Fa ptr in case it was moved on success, and leaves it unchanged on failure. .Pp If .Fa ptr was previously allocated, the objects stored at .Fa ptr Ns Li "[0]" , .Fa ptr Ns Li "[1]" , \&..., up to the shorter of its old .Fa number and its new .Fa number , are copied into the new memory, like .Xr realloc 3 . .Pp .Fa ptr may be null and .Fa number may be zero. .Fa size must be nonzero. .Pp The memory allocated by .Nm may be freed with .Fo reallocarr .Li & Ns Fa ptr , .Li 0 , .Fa size .Fc , which will always succeed and unconditionally set .Fa ptr to null. .Pp Like .Xr calloc 3 , .Nm fails gracefully if the product of .Fa number and .Fa size would overflow the representable size of memory. Unlike .Xr calloc 3 , new memory allocated by .Nm is not zero-initialized. .Pp The .Nm function may alter .Va errno as a side effect. .Pp Note that the argument .Fa ptrp is a pointer to a pointer to allocated memory, unlike .Xr realloc 3 which takes a pointer to allocated memory. .Sh RETURN VALUES On successful completion, .Nm returns 0 and updates .Fa ptr . Otherwise, an .Xr errno 2 is returned, and .Fa ptr and the memory it points to are unmodified. .Sh EXAMPLES The following uses .Fn reallocarr to initialize an array of .Dv INITSIZE integers, then resizes it to .Dv NEWSIZE elements, and finally frees it: .Bd -literal -offset indent 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); .Ed .Sh SEE ALSO .Xr calloc 3 , .Xr realloc 3 , .Xr reallocarray 3 .Sh HISTORY .Nm first appeared in .Nx 7.0 . .Ox introduced the .Xr reallocarray 3 function for the same purpose, but the interface makes it difficult to correctly handle zero-sized allocations.