Freigeben über


_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