Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
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