Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
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 _allocazurückgegeben wirdfree.
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