_Alloca( ), API-Bibliotheksroutine
Reserviert für die aufrufende Routine einen Block vom Stapelspeicher.
void FAR * _Alloca(unsigned int size)
unsigned int size; /* Size of stack space to allocate in
bytes. */
Hinweise
_Alloca( ) gibt einen Zeiger auf den Block zurück, wenn der Block reserviert wurde. Wenn der Block nicht reserviert werden konnte, gibt _Alloca( ) Null zurück. _Alloca( ) gibt den Speicher beim Beenden der Routine automatisch frei. Damit ist keine entsprechende Freigaberoutine erforderlich.
Vorsicht Einige C-Compiler, wie z. B. MPW C, unterstützen keine Reservierung von Stapelspeicher. Aufrufe von _Alloca( ) mit solchen Compilern führen zu unvorhersehbaren Ergebnissen. Verwenden Sie in Ihrem Code stattdessen lokale Variablen oder _AllocHand( )-Aufrufe und _FreeHand( )-Aufrufe zum Reservieren von Speicher.
Weitere Informationen zum Erstellen einer API-Bibliothek und ihrer Integration in Visual FoxPro finden Sie unter Zugreifen auf die Visual FoxPro-API.
Beispiel
Im folgenden Beispiel wird die Aktion der Visual FoxPro-Funktion REPLICATE( ) dupliziert. Der zum Duplizieren des Zeichens temporär verwendete Speicher wurde mit _Alloca( ) reserviert.
Visual FoxPro-Code
SET LIBRARY TO ALLOCA
x = xREPLICATE("x", 120)
? x
? LEN(x)
C-Code
#include <pro_ext.h>
void FAR allocaEx(ParamBlk FAR *parm)
{
char FAR *rep;
char c = *(char *) _HandToPtr(parm->p[0].val.ev_handle);
rep = _Alloca((int) parm->p[1].val.ev_long + 1);
_MemFill(rep, c, (int) parm->p[1].val.ev_long);
rep[parm->p[1].val.ev_long] = '\0'; // null terminate
_RetChar(rep);
}
FoxInfo myFoxInfo[] =
{
{"XREPLICATE", (FPFI) allocaEx, 2, "C,I"},
};
FoxTable _FoxTable =
{
(FoxTable FAR *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
Siehe auch
_AllocHand( ), API-Bibliotheksroutine | _FreeHand( ), API-Bibliotheksroutine | REPLICATE( )-Funktion | Zugreifen auf die Visual FoxPro-API