18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

func: c1 1 c3 3 c4 5<br />

Si noti in particolare come il valore di c4 mantenga il proprio valore (incrementato di volta in<br />

volta) ad ogni chiamata della funzione func. Questo è un semplice modo <strong>per</strong> tenere traccia di<br />

quante volte viene richiamata una funzione.<br />

10.3 Allocazione di memoria<br />

Il linguaggio C non offre primitive di gestione di memoria 1 e nemmeno la raccolta della spazzatura<br />

(garbage collection sembra più raffinato, ma di quello si tratta).<br />

La memoria usata dai programmi può essere di tre tipi: statica, dinamica, automatica. Una<br />

variabile o struttura dati statica è quella dichiarata in compilazione, cui il linker assegna un indirizzo<br />

immutabile. Una struttura dati dinamica è allocata durante il funzionamento del programma,<br />

<strong>per</strong> esempio chiamando malloc e accedendo allo spazio così ottenuto tramite un puntatore.<br />

Una variabile cosiddetta “automatica” viene allocata sullo stack e scompare al termine del blocco<br />

di codice che la dichiara.<br />

Una variabile statica è inizializzata a zero, a meno che il programma non dichiari un valore<br />

costante da precaricare nella variabile. Le variabili inizializzate sono salvate su disco e risiedono<br />

nel “segmento dati” del programma e del file eseguibile ELF; le variabili non inizializzate stanno<br />

nel “segmento bss” del programma, una zona di memoria che viene allocata e azzerata prima<br />

dell’esecuzione del programma, il file su disco non contiene una copia del bss ma solo la sua<br />

dichiarazione.<br />

Una variabile dinamica risiede in memoria che viene richiesta al sistema durante il funzionamento<br />

del programma. Al momento dell’allocazione non si possono fare assunzioni sul contenuto<br />

di tale memoria: potrebbe essere azzerata ma potrebbe contenere informazioni residue di<br />

precedenti allocazioni poi liberate. Ad ogni malloc deve corrispondere una free, in mancanza<br />

della quale abbiamo una situazione di <strong>per</strong>dita di memoria (memory leakage) e la dimensione<br />

del programma in esecuzione aumenterà in continuazione. Mentre la memoria di un programma<br />

in spazio utente viene liberata tutta al termine del programma, una allocazione non liberata<br />

in spazio kernel causa una <strong>per</strong>dita di memoria che può essere recu<strong>per</strong>ata solo riavviando la<br />

macchina.<br />

Una variabile automatica è una variabile locale di una funzione o di un blocco di codice, risiede<br />

sullo stack e non viene inizializzata a meno che il programmatore non imponga un valore a tale<br />

variabile; in tal caso il codice macchina generato dal compilatore contiene le istruzioni necessarie<br />

a riempire la variabile come richiesto. La memoria delle variabili automatiche, essendo parte dello<br />

stack del programma, non è più utilizzabile al termine della procedura che definisce la variabile<br />

stessa.<br />

Esempi:<br />

int i; /* dato inizializzato a zero, segmento bss */<br />

int v[4] = {2,1,}; /* dato inizializzato a {2,1,0,0}, segmento dati */<br />

int j = f(3, i); /* errore: valore non noto in compilazione */<br />

int *f(int x, int y)<br />

{<br />

int z; /* var. automatica, non so quanto vale */<br />

int a=0, b=1, c=2; /* variabili inizializzate a run-time */<br />

int *p = malloc(4 * sizeof(int)); /* inizializzazione valida a run-time */<br />

1 Come new, creatori e distruttori tipici dei linguaggi ad oggetti.<br />

104

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!