2012-02-04 17 views
11

Stavo revisionando C e mi sono imbattuto in funzioni alloca/libere che sono descritte come allocazione di spazio su uno stack. È lo stesso di malloc/free? o questo è qualcosa di diverso? Grazie.Funzione alloca in C

+0

Il seguente link suggerisce che 'alloc' è una funzione diversa: http://cboard.cprogramming.com/c-programming/140380-k-r-5-6-stumped-again.html –

+0

Penso che tu abbia ragione. Penso che sia il loro esempio di implementazione di un allocatore .. – Cemre

+0

Stai rivedendo K & R? Devi essere brillante. – abelenky

risposta

22

Penso che intenda lo alloca che viene utilizzato per allocare memoria nello stack. E sì, questo è diverso da malloc e free che allocano sullo heap.

Non tentare di liberare memoria allocata con alloca perché viene automaticamente liberata quando la funzione che chiama alloca torna al proprio chiamante.

L'utilizzo degli array di lunghezza variabilee/o C99 può essere un'attività rischiosa poiché è possibile che l'stack venga prontamente sovraccaricato se si utilizzano questi strumenti in modo imprudente.

+4

Il terzo paragrafo non può essere sottolineato abbastanza. Non c'è quasi nessun modo sicuro per usare 'alloca' o VLA. –

3

malloc, calloc e realloc funzioni allocare spazio sull'heap.

free funzione "libera" lo spazio precedentemente assegnato da queste funzioni.

0

Aggiunta di alcune informazioni aggiuntive a una vecchia risposta.

malloc() può essere utilizzato per qualche motivo, alcuni di loro sono

  1. allocazione dinamica della memoria
  2. Scope (Quando si ha la necessità di memoria che rimane tra chiamate di funzione)

Ma, uno in più lavoro che viene aggiunto con malloc() è necessario esplicitamente free() la memoria allocata.

Quindi, al fine di utilizzare solo il memoria dinamica funzione di allocazione, e per evitare il sovraccarico di free(), si può usare alloca() nel loro programma. Ciò è reso possibile perché la memoria è allocata sullo stack (come menzionato da altre risposte) quando viene utilizzato lo alloca().

+0

@NickA Spero che Haris abbia fatto. L'ho risolto in ogni caso. – cmaster