Freigeben über


_alloca

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

void *_alloca( 
   size_t size 
);

Parameter

  • [in] size
    Im Stapel zugeordnet, Bytes.

Rückgabewert

Die Routine _alloca gibt ein void Zeiger auf den reservierten Platz zurück, der garantiert wird, zum Speichern eines beliebigen Typs Objekt ordnungsgemäß ausgerichtet sind. Wenn size 0 ist, wird _alloca ein Element der Länge 0 zu und gibt einen gültigen Zeiger zu diesem Element zurück.

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

Hinweise

_alloca ordnet size Bytes vom Programmstapel zu. Der reservierte Platz wird automatisch freigegeben, wenn die aufrufende Funktion beendet (nicht wenn die Zuordnung lediglich aus Bereich abgeschlossen ist). Daher übergeben Sie nicht den Zeigerwert, der von _alloca als Argument an frei zurückgegeben wird.

Es gibt Einschränkungen zu _alloca in einem Ausnahmehandler (EH) explizit aufrufen. Eh-Routinen, die auf x86-class Prozessoren ausgeführt werden, werden in einen eigenen Arbeitsspeicherframen: Sie führen Aufgaben im Speicherplatz aus, der nicht auf der aktuellen Position des Stapelzeigers der übergeordneten Funktion ist. Die häufigsten Implementierungen enthalten Ausdrücke der Windows NTstrukturierten ausnahmebehandlung (SEH) und C++-catch-Klausel. Daher _alloca in folgenden Szenarien führt explizit aufrufen Programmausfälle während Resultsets zur aufrufenden EH-Routine:

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

  • Windows NT SEH endgültiger Ausnahmehandler: __finally } {_alloca ()

  • Catch-Klausel-Ausdruck C++ EH

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

SicherheitshinweisSicherheitshinweis

In Windows XP wenn _alloca innerhalb eines try/catch-Blocks aufgerufen wird, müssen Sie _resetstkoflw im catch-Block aufrufen.

Neben den oben beschriebenen Einschränkungen wenn die Option /clr (Common Language Runtime-Kompilierung), _alloca kann nicht in Blöcken __except 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 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. Mit PInvoke rufen Sie die Standard-C-Funktion auf. Weitere Informationen finden Sie unter Beispiele für Plattformaufrufe.

Siehe auch

Referenz

Speicherbelegung

calloc

malloc

realloc

_resetstkoflw

_malloca