alloca(3) выделяет память, которая будет высвобождена автоматически

ОБЗОР

#include <alloca.h>

void *alloca(size_t size);

ОПИСАНИЕ

Функция alloca() выделяет size байтов памяти в стековом кадре вызывающего. Это временное хранилище данных автоматически освобождается после возврата из функции, вызвавшей alloca().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция alloca() возвращает указатель на начало выделенной памяти. Если выделение памяти привело к переполнению стека, то дальнейшее поведение программы не определено.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
alloca() безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

Данная функция отсутствует в POSIX.1.

Очевидно, что данная функция alloca() существует в 32V, 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)!

Замечания для версии 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(), возникло бы между аргументами функции.