Функция
alloca
выделяет
size
байтов памяти в стеке. Это временное хранилище данных автоматически
освобождается после возврата функции, вызвавшей
alloca
к своему владельцу.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Функция
alloca
возвращает указатель на начало выделенной памяти.
Если распределение памяти привело к переполнению стека,
то дальнейшее поведение программы не определено.
СООТВЕТСТВИЕ СТАНДАРТАМ
Совершенно очевидно, что функция
alloca
существует в 32v, pwb, pwb.2, 3bsd и 4bsd.
Об этом существует соответствующая страница руководства
в BSD версии 4.3. В Linux используется версия GNU.
Эта функция не регламентируется стандартами POSIX или SUSv3.
ЗАМЕЧАНИЯ К ВЕРСИИ GNU
Обычно
gcc
переводит вызовы к
alloca
построчно. Этого не делается, если были указаны опции -ansi
или -fno-builtin. Но будьте осторожны! По умолчанию
версия glibc
<stdlib.h>
включает
<alloca.h>
и поэтому содержит строку
# define alloca(size) __builtin_alloca (size)
что приводит к множеству неприятных последствий, если
у кого-то есть своя версия этой функции.
Тот факт, что код рассматривается построчно, означает, что
будет невозможно получить адрес этой функции или изменить ее
поведение через подключение другой, "своей" библиотеки.
Построчный код часто содержит одиночные инструкции, корректирующие
указатель стека и не проверяющие переполнение стека.
Поэтому никогда не сможет возвратится пустая ошибка NULL.
НАЙДЕННЫЕ ОШИБКИ
Функция
alloca
зависит от машины и компилятора. Во многих системах
ее реализация проблематична и содержит много ошибок.
Ее использование очень несерьезно и не одобряется.
Во многих системах
alloca
не может быть использована в листе аргументов вызова функции, так как
пространство под стек, зарезервированное
alloca
появится в середине стека для аргументов функций.