_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
_alloca
size
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 free
zurü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