posix_memalign — aligned memory allocation (ADVANCED REALTIME)
The posix_memalign() function shall allocate size bytes aligned on a boundary specified by alignment, and shall return a pointer to the allocated memory in memptr. The value of alignment shall be a power of two multiple of sizeof(void *).
Upon successful completion, the value pointed to by memptr shall be a multiple of alignment.
If the size of the space requested is 0, the behavior is implementation-defined: either a null pointer shall be returned in memptr, or the behavior shall be as if the size were some non-zero value, except that the behavior is undefined if the the value returned in memptr is used to access an object.
[CX] The free() function shall deallocate memory that has previously been allocated by posix_memalign().
For purposes of determining the existence of a data race, posix_memalign() shall behave as though it accessed only memory locations accessible through its argument and not other static duration storage. The function may, however, visibly modify the storage that it allocates. Calls to aligned_alloc(), calloc(), free(), malloc(), posix_memalign(), reallocarray(), and realloc() that allocate or deallocate a particular region of memory shall occur in a single total order (see 4.15.1 Memory Ordering), and each such deallocation call shall synchronize with the next allocation (if any) in this order.
Upon successful completion, posix_memalign() shall return zero; otherwise, an error number shall be returned to indicate the error and the contents of memptr shall either be left unmodified or be set to a null pointer.
If size is 0, either:
posix_memalign() shall not attempt to allocate any space, in which case either an implementation-defined error number shall be returned, or zero shall be returned with a null pointer returned in memptr, or
posix_memalign() shall attempt to allocate some space and, if the allocation succeeds, zero shall be returned and a pointer to the allocated space shall be returned in memptr. The application shall ensure that the pointer is not used to access an object.
The posix_memalign() function shall fail if:
- [EINVAL]
- The value of the alignment parameter is not a power of two multiple of sizeof(void *).
- [ENOMEM]
- There is insufficient memory available with the requested alignment.
The following example shows how applications can obtain consistent behavior on error by setting *memptr to be a null pointer before calling posix_memalign().
void *ptr = NULL; ... //do some work, which might goto error if (posix_memalign(&ptr, align, size)) goto error;
//do some more work, which might goto error ... error: free(ptr); //more cleanup;
The posix_memalign() function is part of the Advisory Information option and need not be provided on all implementations.
None.
None.
XBD <stdlib.h>
First released in Issue 6. Derived from IEEE Std 1003.1d-1999.
In the SYNOPSIS, the inclusion of <sys/types.h> is no longer required.
Austin Group Interpretation 1003.1-2001 #058 is applied, clarifying the value of the alignment argument in the DESCRIPTION.
Austin Group Interpretation 1003.1-2001 #152 is applied, clarifying the behavior when the size of the space requested is 0.
POSIX.1-2008, Technical Corrigendum 2, XSH/TC2-2008/0251 [526] and XSH/TC2-2008/0252 [520,526] are applied.
Austin Group Defect 1302 is applied, aligning this function with the requirements of the ISO/IEC 9899:2018 standard on other memory allocation functions.
return to top of page