alloca

Autres langues

Langue: pl

Version: 2002-07-17 (fedora - 25/11/07)

Section: 3 (Bibliothèques de fonctions)

NAZWA

alloca - alokacja pamięci

SKŁADNIA

#include <alloca.h>

void *alloca(size_t rozmiar);

OPIS

Funkcja alloca przydziela rozmiar bajtów pamięci na ramce stosu procedury, z której została wywołana. Ta tymczasowa przestrzeń jest automatycznie zwalniana po powrocie funkcji, które wywołuje alloca do miejsca wywołania.

WARTOŚĆ ZWRACANA

Funkcja alloca zwraca wskaźnik do początku przydzielonej pamięci. Gdy przydzielenie pamięci spowoduje przepełnienie stosu, zachowanie programu nie jest określone.

ZGODNE Z

Istnieją dowody, że funkcja alloca występowała w 32v, pwb, pwb.2, 3bsd oraz 4bsd. W BSD 4.3 istnieje dla niej strona podręcznika. Linux korzysta z wersji GNU. Funkcja ta nie występuje w POSIX ani w SUSv3.

UWAGI DOTYCZĄCE WERSJI GNU

Normalnie, gcc przekłada wywołania alloca poprzez kod wplatany (inlined). Nie będzie to czynione, gdy podana zostanie jedna z opcji: -ansi lub -fno-builtin. Lecz należy być ostrożnym! Domyślnie, zawarta w glibc wersja <stdlib.h> włącza <alloca.h> zawierający wiersz
# define alloca(size) __builtin_alloca (size)
z niepożądanymi konsekwencjami, jeśli ktoś posiada własną wersję tej funkcji.

Fakt, że kod tej funkcji jest wplatany powoduje niemożliwość pobrania jej adresu, jak też niemożliwość zmiany jej zachowania poprzez konsolidacją z inną biblioteką,

Kod wplatany często składa się z pojedynczej instrukcji modyfikującej wskaźnik stosu, lecz nie sprawdzającej jego przepełnienia. Zatem nigdy nie jest zwracana wartość NULL świadcząca o błędzie.

BŁĘDY

Funkcja alloca jest zależna od architektury i kompilatora. W wielu systemach jej implementacja jest niepoprawna. Odradza się jej używania.

W wielu systemach alloca nie może być używana w obrębie listy argumentów w wywołaniu funkcji, gdyż zarezerwowana przez alloca przestrzeń stosu znalazłaby się w środku przezstrzeni stosu przeznaczonej na argumenty funkcji.

ZOBACZ TAKŻE

brk(2), pagesize(2), calloc(3), malloc(3), realloc(3)