Freigeben über


_alloca

Belegt Speicher für den Stapel.Diese Funktion ist veraltet, da eine sicherere Version verfügbar ist. Weitere Informationen finden Sie unter _malloca.

void *_alloca( 
   size_t size 
);

Parameter

  • [in] size
    Vom Stapel zu belegenden Bytes.

Rückgabewert

Die _alloca Routine gibt einen void Zeiger auf den belegten Platz zurück, der auf jeden Fall zum Speichern eines beliebigen Typs - Objekt ordnungsgemäß ausgerichtet werden soll.Wenn size 0 ist, wird die Länge 0 _alloca ein Element und einen gültigen Zeiger auf dieses Element zurück.

Eine Stapelüberlaufausnahme wird generiert, wenn das Leerzeichen nicht zugeordnet werden kann.Die Stapelüberlaufausnahme ist keine Ausnahme in C++. Dies ist eine strukturierte Ausnahme.Anstatt die behandelnde C++-Ausnahmebehandlung zu verwenden, müssen Sie Strukturierte Ausnahmebehandlung (SEH) verwenden.

Hinweise

_alloca ordnet size Bytes aus dem Programm stapel.Der reservierte Platz wird automatisch beendet wird, wenn das der aufrufenden Funktion freigegeben (nicht, wenn die Zuordnung nur außerhalb des gültigen Bereichs übergeben).Übergeben Sie daher nicht den Zeigerwert, der von _alloca als Argument an Sie gebenzurückgegeben wurde.

Es gibt Einschränkungen _alloca in einem Ausnahmehandler (EH) explizit aufrufen.Eh-Routinen, die auf x86-class Prozessoren ausgeführt werden, verwenden in ihren eigenen Arbeitsspeicher framen: Sie führen ihre Aufgaben im Bereich Store aus, der nicht auf Grundlage der aktuellen Position des Stapels zeigers der einschließende Funktion ist.Die am häufigsten verwendeten Implementierungen enthalten Ausdrücke der strukturierten ausnahmebehandlung Windows NT (SEH) und C++-catch-Klausel.Daher _alloca in den folgenden Szenarien führt explizit aufrufen, während Programmfehler der Rückgabe an die aufrufende EH-Routine:

  • Windows NT SEH Ausnahme filterausdruck: __except (_alloca () )

  • Windows NT SEH abschließender Ausnahmehandler: __finally {_alloca () }

  • Catch-Klausel-Ausdruck C++ EH

Allerdings kann direkt aus einer _alloca EH-Routine oder einem von der Anwendung bereitgestellten Rückruf aufgerufen werden, der durch den Aufruf eines der zuvor aufgelisteten EH-Szenarien abruft.

SicherheitshinweisSicherheitshinweis

Unter Windows XP wenn _alloca in einem try/catch-Block aufgerufen werden muss, müssen Sie _resetstkoflw im catch-Block aufrufen.

Neben den oben beschriebenen Einschränkungen wenn die/clr (Common Language Runtime Compilation) Option, _alloca kann nicht in __except Blöcken verwendet wird.Weitere Informationen finden Sie unter Einschränkungen /clr-.

Anforderungen

Routine

Erforderlicher Header

_alloca

<malloc.h>

Beispiel

// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.

#include <windows.h>
#include <stdio.h>
#include <malloc.h>

int main()
{
    int     size = 1000;
    int     errcode = 0;
    void    *pData = NULL;

    // Note: Do not use try/catch for _alloca,
    // use __try/__except, since _alloca throws
    // Structured Exceptions, not C++ exceptions.

    __try {
        // An unbounded _alloca can easily result in a 
        // stack overflow.
        // Checking for a size < 1024 bytes is recommended.
        if (size > 0 && size < 1024)
        {
            pData = _alloca( size );
            printf_s( "Allocated %d bytes of stack at 0x%p",
                      size, pData);
        }
        else
        {
            printf_s("Tried to allocate too many bytes.\n");
        }
    }

    // If an exception occured with the _alloca function
    __except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
    {
        printf_s("_alloca failed!\n");

        // If the stack overflows, use this function to restore.
        errcode = _resetstkoflw();
        if (errcode)
        {
            printf_s("Could not reset the stack!\n");
            _exit(1);
        }
    };
}
  

.NET Framework-Entsprechung

Nicht zutreffend. Um die Standard-C-Funktion aufrufen, verwenden Sie PInvoke. Weitere Informationen finden Sie unter Plattformaufruf-Beispiele.

Siehe auch

Referenz

Speicherbelegung

calloc

malloc

realloc

_resetstkoflw

_malloca