Freigeben über


_alloca

Belegt Speicher für den Stapel. Diese Funktion ist veraltet, da eine sicherere Version verfügbar ist. siehe _malloca.

Syntax

void *_alloca(
   size_t size
);

Parameter

size
Bytes, die vom Stapel zugeordnet werden.

Rückgabewert

Die _alloca Routine gibt einen void Zeiger auf den zugewiesenen Bereich zurück, der entsprechend für die Speicherung eines beliebigen Objekttyps ausgerichtet ist. Wenn size 0 ist, weist _alloca ein Element der Länge 0 zu und gibt einen gültigen Zeiger auf dieses Element zurück.

Eine Stapelüberlaufausnahme wird generiert, wenn der Speicherplatz nicht zugeordnet werden kann. Die Stapelüberlaufausnahme ist keine C++-Ausnahme; es ist eine strukturierte Ausnahme. Statt die C++-Ausnahmebehandlung zu verwenden, müssen Sie die strukturierte Ausnahmebehandlung (Structured Exception Handling, SEH) verwenden.

Hinweise

_allocasize ordnet Bytes aus dem Programmstapel zu. Der zugewiesene Speicherplatz wird automatisch freigegeben, wenn die aufrufende Funktion beendet wird (nicht wenn die Zuordnung lediglich den Gültigkeitsbereich übergibt). Übergeben Sie daher nicht den Zeigerwert, der als Argument freezurückgegeben wird_alloca.

Es gelten Einschränkungen beim expliziten Aufruf von _alloca in einem Ausnahmehandler (exception handler, EH). EH-Routinen, die auf x86-Prozessoren ausgeführt werden, arbeiten in ihrem eigenen Speicherframe: Sie führen ihre Aufgaben im Arbeitsspeicher aus, die nicht auf der aktuellen Position des Stapelzeigers der eingeschlossenen Funktion basieren. Zu den am häufigsten verwendeten Implementierungen gehören Windows-Ausdrücke für die strukturierte Ausnahmebehandlung (SEH) und C++-Catch-Klauseln. Daher führt das explizite Aufrufen von _alloca in jedem der folgenden Szenarios zu einem Programmfehler während der Rückgabe auf die aufrufende EH-Routine.

  • Windows SEH-Ausnahmefilterausdruck: __except ( _alloca() )

  • Endgültiger Ausnahmehandler für Windows SEH: __finally { _alloca() }

  • C++-EH-Catch-Klauselausdruck

Allerdings kann _alloca direkt innerhalb einer EH-Routine aufgerufen werden oder von einem von einer Anwendung bereitgestellten Rückruf, der von einem der zuvor aufgeführten EH-Szenarios aufgerufen wird.

Wichtig

Wenn _alloca innerhalb eines Try-Blocks aufgerufen wird, müssen Sie den Catch-Block aufrufen _resetstkoflw .

Zusätzlich zu den oben genannten Einschränkungen kann bei Verwendung der/clr Option _alloca (Common Language Runtime Compilation) nicht in __except Blöcken verwendet werden. Weitere Informationen finden Sie unter /clr Einschränkungen.

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 occurred 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 == 0) //  _resetstkoflw() returns 0 on failure
        {
            printf_s("Could not reset the stack!\n");
            _exit(1);
        }
    };
}
Allocated 1000 bytes of stack at 0x0012FB50

Siehe auch

Speicherzuweisung
calloc
malloc
realloc
_resetstkoflw
_malloca