Scroll to navigation

ALLOCA(3) Linux-Programmierhandbuch ALLOCA(3)

BEZEICHNUNG

alloca - Speicher reservieren, der automatisch freigegeben wird

ÜBERSICHT

#include <alloca.h>

void *alloca( size_t Größe);

BESCHREIBUNG

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.

RÜCKGABEWERT

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.

ATTRIBUTE

Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.
Schnittstelle Attribut Wert
alloca() Multithread-Fähigkeit MT-Safe

KONFORM ZU

Diese Funktion ist nicht in POSIX.1 enthalten.

Es ist bekannt, dass die Funktion alloca() in 32V, PWB, BWB.2, 3BSD und 4BSD erschienen ist. Es gibt unter 4.3BSD eine Handbuchseite dafür. Linux verwendet die GNU-Version.

ANMERKUNGEN

Die Funktion alloca() ist maschinen- und compilerabhängig. Für bestimmte Anwendungen kann ihre Benutzung die Leistungsfähigkeit im Vergleich zu malloc(3) plus free(3) erhöhen. 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!

Bemerkungen zur GNU-Version

Normalerweise übersetzt gcc(1) Aufrufe von alloca() mit »Inlined-Code«. Dies ist nicht so, wenn entweder die Option -ansi, -std=c89, -std=c99 oder -std=c11 angegeben und der Header <alloca.h> nicht eingebunden ist. Andernfalls (ohne Option -ansi oder -std=c*) bindet die Glibc-Version von <stdlib.h> <alloca.h> ein und dieser Header enthält die Zeilen


#ifdef  __GNUC__
#define alloca(size)   __builtin_alloca (size)
#endif


mit chaotischen Konsequenzen, wenn jemand eine private Version dieser Funktion hat.

Die Tatsache, dass der Code inlined 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.

Der »Inlined-Code« besteht oft aus einer einzelnen Anweisung zum Anpassen des Stapelspeicher-Zeigers und prüft nicht, ob ein Stapelspeicher-Überlauf auftritt. Daher gibt es dort keine NULL-Fehler-Rückkehr.

FEHLER

Es gibt keine Fehleranzeige, wenn der Stapelspeicher-Frame nicht erweitert werden kann. (Das Programm wird jedoch wahrscheinlich nach einer fehlgeschlagenen Reservierung ein SIGSEGV-Signal empfangen, wenn es versucht auf den nicht reservierten Speicher 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.

SIEHE AUCH

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

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.04 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Ralf Demmer <rdemmer@rdemmer.de>, Chris Leick <c.leick@vollbio.de>, Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> 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.

6. März 2019 GNU