Функция
posix_memalign()
распределяет
size
байтов и помещает адрес распределенной памяти в
*memptr.
Адрес распеределенной памяти будет кратен
alignment,
который должен быть степенью числа 2 и быть кратным
sizeof(void *).
Устаревшая функция
memalign()
размещает
size
байтов и возвращает указатель на распределенную память.
Адрес памяти будет кратен
boundary,
который должен быть степенью числа 2.
Устаревшая функция
valloc()
размещает
size
байтов и возвращает указатель на распределенную память.
Адрес памяти будет кратен размеру страницы.
Эквивалентно
memalign(sysconf(_SC_PAGESIZE),size).
Для всех этих трех процедур мамять не будет заполнена нулями.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
memalign()
и
valloc()
возвращают указатель на размещенную память, или
NULL
если запрос выдал ошибку.
posix_memalign()
возвращает ноль при нормальном завершении работы или, при ошибке,
одно из значений, перечисленных в следующем разделе.
Заметим, что
errno
при этом не определяется.
НАЙДЕННЫЕ ОШИБКИ
EINVAL
Параметр
alignment
не равен степени числа 2 или не кратен
sizeof(void *).
ENOMEM
Недостаточно памяти для выполнения запроса на размещение.
ЗАМЕЧАНИЯ
posix_memalign()
проверяет, чтобы
alignment
соответствовало всем требованиям, указанным выше.
memalign()
может не проверять корректность параметра
boundary.
POSIX требует, чтобы память, полученная от
posix_memalign()
была высвобождена через
free().
Некоторые системы не обеспечивают метода исправления памяти,
выделенной с помощью
memalign()
или
valloc()
(так как можно передать
free()
указатель, полученный из
malloc(),
в то время как
memalign()
будет вызывать
malloc()
и только затем выравнивать полученное значение).
GNU libc позвволяет памяти, полученной через любую из этих процедур,
быть исправленной с помощью
free().
malloc()
для GNU libc всегда возвращает 8-байтовый выровненный адрес памяти,
так что эти процедуры требуются только если вам нужны большие выровненные
значения.
ДОСТУПНОСТЬ
Функции
memalign()
и
valloc()
доступны в Linux во всех библиотеках libc.
Функция
posix_memalign()
доступна, начиная с glibc 2.1.91.
СООТВЕТСТВИЕ СТАНДАРТАМ
Функция
valloc()
появилась в 3.0 BSD. Она указана, как устаревшая, в BSD 4.3,
и как стандартная, в SUSv2. Этого уже нет в SUSv3.
Функция
memalign()
появиляется в SunOS 4.1.3 но не в BSD 4.4.
Функция
posix_memalign()
пришла из POSIX 1003.1d.