Scroll to navigation

ALLOCA(3) Руководство программиста Linux ALLOCA(3)

ИМЯ

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

ОБЗОР

#include <alloca.h>

void *alloca(size_t size);

ОПИСАНИЕ

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

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

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

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

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

Очевидно, что данная функция 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 или -fno-builtin (и заголовочный файл <alloca.h> не включается). Но будьте осторожны! По умолчанию версия glibc содержит в файле <stdlib.h> включение <alloca.h>, который содержит строку:


#define alloca(size) __builtin_alloca (size)

что приводит к множеству неприятных последствий, если у кого-то есть своя версия этой функции.

Тот факт, что код встраивается, означает, что будет невозможно получить адрес этой функции или изменить её поведение посредством компоновки с другой библиотекой.

Встраиваемый код часто представляет собой одну инструкцию, корректирующую указатель стека и не отслеживающую переполнение стека. Поэтому при ошибке невозможно получить NULL.

ДЕФЕКТЫ

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

Во многих системах alloca() не может быть использована в списке аргументов вызова функции, так как пространство под стек, зарезервированное alloca(), возникло бы между аргументами функции.

СМОТРИТЕ ТАКЖЕ

brk(2), longjmp(3), malloc(3)

2008-01-24 GNU