Вы не можете делать то, что предлагаете. alloca
- особенный зверь, его можно вызывать только явно внутри тела функции, а не в выражениях аргументов вызова функции.
[...]
* * ОПИСАНИЕ тысяча двадцать-один
Функция alloca()
выделяет размер байта пространства в стеке.
рамка звонящего. Это временное пространство автоматически освобождается
когда функция, вызвавшая alloca()
, возвращается к своему вызывающему.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция alloca()
возвращает указатель на начало
выделенное пространство. Если выделение вызывает переполнение стека, программа
поведение не определено.
[...]
СООТВЕТСТВУЮЩИМ
Эта функция отсутствует в POSIX.1.
Есть доказательства того, что функция alloca()
появилась в 32 В, PWB,
PWB.2, 3BSD и 4BSD. В 4.3BSD для этого есть справочная страница. Linux
использует версию GNU.
ПРИМЕЧАНИЯ
Функция alloca()
зависит от машины и компилятора. За
В некоторых случаях его использование может повысить эффективность по сравнению с
использование malloc(3)
плюс free(3)
. В некоторых случаях это может также
упростить освобождение памяти в приложениях, использующих longjmp(3)
или
siglongjmp(3)
. В противном случае его использование не рекомендуется.
Поскольку пространство, выделенное alloca()
, выделено в стеке
кадр, это пространство автоматически освобождается, если функция возвращает
перепрыгнул через звонок на longjmp(3)
или siglongjmp(3)
.
Пространство, выделенное alloca()
, не освобождается автоматически, если
указывающий на него указатель просто выходит из области видимости.
Не пытайтесь free(3)
место, выделенное alloca()
!
Замечания по версии GNU
Обычно gcc (1) переводит вызовы на alloca()
с встроенным кодом.
Это не делается, когда -ansi
, -std=c89
, -std=c99
или
Опция -std=c11
указана, а заголовок <alloca.h>
не включен.
В противном случае (без опции -ansi
или -std=c*
) версия glibc
<stdlib.h>
включает <alloca.h>
и содержит строки:
#ifdef __GNUC__
#define alloca(size) __builtin_alloca (size)
#endif
с грязными последствиями, если у кого-то есть личная версия этой функции.
Тот факт, что код встроен, означает, что невозможно взять
адрес этой функции или изменить ее поведение, связав
с другой библиотекой.
Встроенный код часто состоит из одной инструкции, регулирующей
указатель стека и не проверяет переполнение стека. Таким образом, есть
нет NULL
ошибка возврата.
ОШИБКА
Нет индикации ошибки, если кадр стека не может быть расширен.
(Однако после неудачного размещения программа, скорее всего, получит
SIGSEGV
сигнал, если он пытается получить доступ к нераспределенному пространству.)
Во многих системах alloca()
нельзя использовать внутри списка аргументов.
вызова функции, потому что пространство стека зарезервировано alloca()
появится в стеке в середине пространства для функции
аргументы.