Programmare in C – Puntatori che puntano allo stesso indirizzo

Un aspetto importante del linguaggio C è che un numero qualsiasi di puntatori possono fare riferimento allo stesso indirizzo.

Per esempio, si potrebbe dichiarare p, q e r come puntatori intri e s impostarli tutti a puntare alla variabile i, così come mostrato in questa porzione di codice:

int i;
int *p, *q, *r;

p = &i;
q = &i;
r = p;

Da notare che in questo codice, r punta alla stessa cosa a cui p punta, che è i. Si possono assegnare puntatori l'un con l'altro e l'indirizzo è copiato dal lato destro al lato sinistro durante l'assegnazione. Dopo aver eseguito il codice di cui sopra, ecco cosa è successo. La variabile i ha ora 4 nomi, i, *p, *q, *r. Non vi è limite al numero di puntatori che possono contenere (e quindi puntare ) allo stesso indirizzo.

Programmare in C - Puntatori: Errori Comuni

Errore #1: puntatori non inizializzati

Un modo semplice per creare un bug nell'uso dei puntatori è provare a referenziare il valore di un puntatore quando il puntatore non è stato inizializzato e pertanto quando non punta ancora ad un indirizzo di memoria valido: Per esempio;

int *p;
*p = 12;

Il puntatore p è non inizializzato e punta ad una locazione di memoria casuale. Potrebbe puntare allo stack di sistema, oppure ad una variabile globale, oppure allo spazio di codice del programma oppure al sistema operativo. Quando si scrive *p=12 il programma proverà a scrivere 12 nell'indirizzo contenuto in p (indirizzo che abbiamo detto essere casuale).

Il programma potrebbe andare immediatamente in crash, potrebbe andare in crash dopo una mezzora, potrebbe così fornire dati corrotti ad un'altra parte del programma senza che voi possiate mai accorgervene. Assicuratevi quindi di aver inizializzato tutti i puntatori inizializzati ad un indirizzo valido prima di farne uso.

Errore #2: Errato riferimento a puntatore

Si genera un errato riferimento a puntatore quando il valore del puntatore viene referenziato anche se il puntatore non punta ad un blocco valido. Un modo per generare questo errore è scrivere p=q dove q non è inizializzato. Il puntatore p sarà a sua volta non inizializzato ed ogni riferimento a *p diventa un errato riferimento.
L'unico modo per evitare di generare questo errore è disegnare passo passo l'esecuzione del programma e verificare che tutti i puntatori siano in qualche modo inizializzati. L'errato riferimento a puntatore provoca il crash del programma, analogamente a quanto accade per l'errore #1.

Errore #3: Zero Pointer Reference

Un errore chiamato “zero pointer reference” si genera ogni qual volta che un puntatore che punta a 0 viene utilizzato in un'istruzione che cerca di fare riferimento al contenuto del blocco. Per esempio, se p è un puntatore ad un intero, il seguente codice non è valido:

p = 0;
*p = 12;

Non vi sono blocchi di memoria puntati da p, di conseguenza cercare di leggere o scrivere qualsiasi cosa da o su quel blocco crea un errore “zero pointer reference”.

Per evitare queste tre tipologie di errore è consigliabile, finchè non si è completamente padroni della filosofia di funzionamento dei puntatori, disegnare passo passo ciò che sta eseguendo il programma.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend