alloca - Speicher reservieren, der automatisch freigegeben wird
Standard-C-Bibliothek (
libc,
-lc)
#include <alloca.h>
void *alloca(size_t Größe);
Die Funktion
alloca() reserviert
Größe Byte auf im
Stapelspeicher-Frame des Aufrufenden. Dieser temporäre Bereich wird
automatisch freigegeben, wenn die Funktion, die
alloca() aufrief, zum
Aufrufenden zurückkehrt.
Die Funktion
alloca() gibt einen Zeiger auf den Anfang des reservierten
Bereichs zurück. Falls das Reservieren einen Überlauf des
Stapelspeichers verursachte, ist das Verhalten des Programms undefiniert.
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
alloca() |
Multithread-Fähigkeit |
MT-Safe |
Diese Funktion ist nicht in POSIX.1 enthalten.
alloca() stammt von PWB und 32V und erscheint in allen Ableitungen davon.
Die Funktion
alloca() ist maschinen- und compilerabhängig. Da sie
Speicher vom Stapel reserviert, ist sie schneller als
malloc(3) und
free(3). In bestimmten Fällen kann sie außerdem das
Freigeben von Speicher in Anwendungen vereinfachen, die
longjmp(3) oder
siglongjmp(3) benutzen. Andernfalls wird von ihrem Gebrauch abgeraten.
Da der durch
alloca() reservierte Bereich innerhalb des
Stapelspeicher-Frames liegt, wird dieser Bereich automatisch freigegeben, wenn
die Funktionsrückkehr durch den Aufruf von
longjmp(3) oder
siglongjmp(3) übersprungen wird.
Der mittels
alloca() reservierte Bereich wird
nicht automatisch
freigegeben, falls der Zeiger, der sich darauf bezieht, den Geltungsbereich
verlässt.
Versuchen Sie nicht, mit
free(3) Speicher freizugeben, der mit
alloca() reserviert wurde!
Notwendigerweise ist
alloca() im Compiler eingebaut, auch als
__builtin_alloca() bekannt. Standardmäßig
übersetzen moderne Compiler automatisch alle Verwendungen von
alloca() in die eingebaute Version, allerdings ist dies verboten, falls
Standardkonformität erbeten wird (
-ansi,
-std=c*). In
diesem Fall wird
<alloca.h> benötigt, damit keine
Symbolabhängigkeit ausgegeben wird.
Die Tatsache, dass
alloca() eine eingebaute Funktion ist, bedeutet, dass
es unmöglich ist die Adresse dieser Funktion zu bekommen oder ihr
Verhalten zu ändern, indem mit einer anderen Bibliothek gelinkt wird.
Felder variabler Länge (VLAs) sind Teil des C99-Standards, optional seit
C11 und können für ähnliche Zwecke verwendet werden.
Allerdings können sie nicht in Standard-C++ portiert werden und da sie
Variablen sind, leben sie in ihrem blockbezogenen Geltungsbereich und haben
keine Allocator-ähnliche Schnittstelle. Damit sind sie für die
Implementierung von Funktionalitäten wie
strdupa(3) ungeeignet.
Aufgrund der Natur des Stapelspeichers ist es nicht möglich, zu
prüfen, ob die Reservierung einen Überlauf beim
verfügbaren Platz erzeugt. Daher wird dies weder angezeigt noch ist es
ein Fehler. (Allerdings ist es wahrscheinlich, dass das Programm ein Signal
SIGSEGV erhält, wenn es versucht, auf den nicht
verfügbaren Platz zuzugreifen.)
Auf vielen Systemen kann
alloca() nicht innerhalb der Argumenteliste der
aufrufenden Funktion benutzt werden, weil der durch
alloca()
reservierte Bereich des Stapelspeichers in der Mitte des Bereichs für
die Funktionsarumente liegen würde.
brk(2),
longjmp(3),
malloc(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Ralf Demmer
<
[email protected]>, Chris Leick <
[email protected]>, Mario
Blättermann <
[email protected]> und Helge Kreutzmann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer