Funzione alloca 3 c

Funzione alloca 3 c
Lo spazio che viene periodicamente rilasciato viene assegnato con il comando alloca. Il frame dello stack del chiamante viene assegnato i byte di memoria di lunghezza con il metodo alloca (). Una volta che il codice che ha invocato Alloca () è tornato al suo chiamante, questa memoria provvisoria viene immediatamente rilasciata. All'interno di questa guida, discuteremo dell'uso di alloca () per assegnare lo spazio di memoria a una variabile senza liberare all'ultimo:
  • #includere
  • void *alloca (size_t misurare);

Valore di ritorno

Un riferimento al punto di partenza della regione assegnata viene restituito con il metodo alloca (). Lo script si comporta in modo indefinibile se l'incarico si traduce in uno stack overflow.

Alcune conferme

Posix.1-2001 non fornisce questo metodo. Il metodo alloca () è noto per essere stato presente in 32V, 3BSD, PWB, PWB.2 e 4bsd. È documentato in 4.Pagina web manuale di 3BSD. La variante GNU viene utilizzata da Linux.

Spiegazione

La funzione alloca () dipende dal programma di compilazione e dal sistema di destinazione. Se contrastato all'uso di Malloc (3) più gratuito, l'uso di esso può renderlo più efficiente in alcuni scenari (3). In alcune circostanze, può anche rendere più facili (3) (3), può anche rendere più semplice la separazione di accordi. Tuttavia, non è chiesto di consumarlo.

Supponiamo che la memoria assegnata da alloca () sia riservata all'interno del telaio dello stack. Se in qualche modo il ritorno del metodo viene saltato da una chiamata di funzione a longjmp (3) o siglongjmp, l'archiviazione viene immediatamente rilasciata (3). La memoria libera (3) che alloca () ha assegnato non dovrebbe essere tentata! Le chiamate alloca () vengono spesso tradotte usando uno script inline di GCC (1).

Bug

Se il telaio dello stack potrebbe non essere ampliato, sembra non esserci un messaggio di errore. Sebbene, se l'applicazione tenta di utilizzare la memoria non assegnata dopo un posizionamento fallito, è qualificata per ottenere un segnale SIGSEGV. Poiché questa memoria dello stack assegnata da alloca () potrebbe visualizzare sullo stack all'interno della regione per i parametri del metodo su più piattaforme, alloca () non deve essere utilizzato all'interno dell'elenco dei parametri di una chiamata del metodo.

Esempio 01

Iniziamo con i nostri primi esempi di utilizzo della funzione alloca () di c. Innanzitutto, dobbiamo creare un file C utilizzando l'istruzione touch all'interno dell'attuale directory di lavoro del sistema Kali Linux. Dopodiché, puoi provare ad aprirlo all'interno di qualsiasi editore a tua scelta di aggiungere uno script C al suo interno. Stiamo usando l'editor VIM per aprire "Allocex.file c ".


All'interno del file vuoto, abbiamo aggiunto il seguente codice. Questo codice è iniziato con "stdio.H ”Intestazione per utilizzare il flusso di input e output standard nel programma. Il "alloca.L'intestazione h "è stata utilizzata per utilizzare la funzione alloc () C in questo codice. Questo codice contiene una singola funzione principale () che ha inizializzato una variabile intera denominata "numero" allocata con la memoria della dimensione 4.

Il ciclo "per" è stato inizializzato e utilizzato per incrementare il valore del "numero" variabile di 1 ad ogni indice. Il prossimo loop "per" è stato utilizzato per visualizzare ciascun valore dell'indice del numero variabile utilizzando l'istruzione funzione printf (). Questo codice è stato completato qui. L'abbiamo salvato ed è pronto per la compilazione.


Ora, abbiamo compilato questo file C con il compilatore GCC e creato il suo file di oggetti chiamato "AllocEx.fuori "all'interno della stessa directory di lavoro, io.e., "lavori".


Successivamente, abbiamo eseguito il file di oggetti appena realizzato di questo codice all'interno del "./"Istruzioni. L'output ha visualizzato un totale di 4 valori per la variabile particolare, i.e., Dimensione 4 Allocazione di memoria al numero variabile.


Cambiamo il numero di iterazione all'interno del loop "per", io.e., Cambia da 4 a 5. Il seguente codice è stato aggiornato. Salviamolo prima di compilarlo.


Abbiamo compilato il codice modificato con il compilatore GCC per sovrascrivere il suo file di oggetti.


Durante l'esecuzione, abbiamo l'errore di segmentazione. È perché abbiamo inizializzato la dimensione variabile a 5 e usando il "<” sign to iterate the variable “Number” up to 5 which are a total of 6 memory locations, i.e., should be a total of 5.

Esempio 02

Facciamo un altro esempio per l'assegnazione della memoria rilasciata periodicamente allo stack del puntatore. Abbiamo usato le stesse intestazioni con l'aggiunta di "stdlib.H ”intestazione. Il metodo principale () è stato impostato con la dichiarazione di alcune variabili e un puntatore. Le istruzioni printf e scanf vengono utilizzate per visualizzare e ottenere il numero di input dall'utente mentre la funzione alloca () allocherà la memoria al "numero" della variabile puntatore utilizzando quel particolare numero aggiunto da un utente. Se la memoria assegnata alla variabile "numero è null", i.e., Nessuna memoria allocata, quindi printf () visualizzerà alcuni messaggi di errore ad esso relativi. Inoltre la funzione Exit (0) terminerà questo programma.

Il ciclo "per" utilizza la funzione printf per visualizzare il numero dell'indice corrente e chiede di inserire il valore per un determinato indice utilizzando la funzione scanf. Indipendentemente dal valore che hai aggiunto, sarà incrementato dal numero dell'indice e salvato alla variabile "somma", la funzione printf () verrà visualizzata la "somma" di tutte le iterazioni.


L'abbiamo compilato e creato il suo file di oggetti.


Ha eseguito il suo file di oggetti e ha chiesto la dimensione dell'allocazione della memoria, i.e., 4. Totale di 4 valori sono stati aggiunti dall'utente e riassunti dal programma e visualizzati di seguito:

Conclusione

Questo riguarda l'uso della funzione alloca () per assegnare lo spazio libero a una particolare variabile, in particolare alcune pile. Puoi vedere che non abbiamo usato la funzione "Free ()" per liberare lo spazio assegnato come facciamo di solito nella funzione Malloc ().