#include <stdlib.h> int posix_memalign(void **memptr, size_t alignment, size_t size); #include <malloc.h> void *valloc(size_t size); void *memalign(size_t boundary, size_t size);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
posix_memalign(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
廃止された関数である memalign() は、 size バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。 メモリのアドレスは boundary の倍数になっているはずである。 boundary は 2 のべき乗でなければならない。
廃止された関数である valloc() は size バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。 メモリのアドレスはページサイズの倍数になっているはずである。 これは memalign(sysconf(_SC_PAGESIZE),size) と等価である。
posix_memalign() は成功した場合は 0 を返し、 失敗した場合は次のセクションに記載されたエラー値のいずれかを返す。 errno はセットされないことに注意すること。
いくつかのシステムでは、 memalign() は <malloc.h> ではなく <stdlib.h> で宣言されている。
SUSv2 によると、 valloc() は <stdlib.h> で宣言される。 libc4,5 や glibc では <malloc.h> で宣言されており、 さらに <stdlib.h> でも宣言されることもある (具体的には以下のいずれかの場合: _GNU_SOURCE が定義されている、 _BSD_SOURCE が定義されている、 glibc で _XOPEN_SOURCE_EXTENDED が定義されている、 glibc で _XOPEN_SOURCE が 500 より小さくない値に定義されている)。
posix_memalign() は alignment が上で詳細に述べた必要条件を満たすかどうかを確かめる。 memalign() は boundary パラメータが正しいかどうかの確認を行わないかもしれない。
POSIX では posix_memalign() によって獲得したメモリは free(3) を使って解放することができる必要がある。 いくつかのシステムでは memalign() や valloc() で割り当てられたメモリを再利用する手段が提供されていない。 (なぜなら free(3) に渡すことができるのは malloc(3) から受け取ったポインタだけだが、 例えば memalign() は malloc(3) を呼び出し、得た値をアラインメントしてしまうからである) glibc の実装では、 ここに述べた 3 つの関数のいずれで獲得したメモリも free(3) で再利用することができる。
glibc の malloc(3) は常に 8 バイトにアラインメントされたメモリアドレスを返すので、 ここで述べた関数が必要になるのは 8 バイトよりも大きなアラインメントが必要な場合だけである。