Differenze tra le versioni di "Alloca ()"

Da Gambas-it.org - Wikipedia.
Riga 66: Riga 66:
  
 
=Riferimenti=
 
=Riferimenti=
 
+
* http://man7.org/linux/man-pages/man3/alloca.3.html
 
+
* http://www.gnu.org/software/libc/manual/html_node/Variable-Size-Automatic.html#Variable-Size-Automatic
 
+
* http://programmers.stackexchange.com/questions/116117/should-i-teach-my-students-alloca
 
+
* https://www.strchr.com/alloca
<FONT Color=red size=4><B>Pagina in costruzione !</b></font>
 

Versione delle 07:31, 4 mar 2016

La funzione alloca() dichiarata nel file header alloca.h

void *alloca (size_t __size)

alloca una porzione di memoria che verrà liberata quando si esce dalla funzione di chiamata.


Poiché detta funzione non è contenuta in alcuna libreria dinamica condivisa .so, si potrà fruire delle sue potenzialità richiamandola ed usandola all'interno di una libreria dinamica condivisa .so che dovrà essere da noi creata appositamente. Il suo codice sorgente potrà essere il seguente:

"/tmp/Alloca.c", "#include <alloca.h>" &
"\n\n" &
"char * Inizializza_Alloca (size_t dimen) {" &
"\n\n" &
"   char * c;" &
"\n\n" &
"   c = alloca(dimen);" &
"\n\n" &
"   return c;" &
"\n\n}"

Va sottolineato che il valore da passare alla funzione alloca(), relativo alla dimensione dell'area di memeoria da allocare, non deve essere inferiore a 256 byte.


Mostriamo di seguito un esempio pratico sull'uso della funzione alloca(), la quale verrà utilizzata per allocare un blocco di memoria, e che sarà puntato da un Puntatore da passare alla funzione esterna scanf():

' char * Inizializza_Alloca (size_t dimen)
' Invoca ed utilizza la funzione 'alloca()'.
Private Extern Inizializza_Alloca(dimen As Long) As Pointer In "/tmp/Alloca"

' int scanf (const char *__restrict __format, ...)
' Read formatted input from stdin.
Private Extern scanf(format$ As String, argsP As Pointer) As Integer In "libc:6"


Public Sub Main()
 
 Dim p As Pointer
 
  Creaso()
   
  p = Inizializza_Alloca(512)
  If p = 0 Then Error.Raise("Impossibile allocare memoria con 'alloca()' !")
   
  scanf("%d", p)
   
  Print Int@(p)
  
End


Private Procedure Creaso()
 
 File.Save("/tmp/Alloca.c", "#include <alloca.h>" &
           "\n\n" &
         "char * Inizializza_Alloca (size_t dimen) {" &
           "\n\n" &
           "   char * c;" &
           "\n\n" &
           "   c = alloca(dimen);" &
           "\n\n" &
           "   return c;" &
           "\n\n}")
 
 Shell "gcc -o /tmp/Alloca.so /tmp/Alloca.c -shared" Wait
 
End



Riferimenti