Array di puntatori : inizializzazione

di il
3 risposte

Array di puntatori : inizializzazione

Scrivendo questo codice banale:
struct elem {
	int val;
	elem* next;
} ** hashtable;

hashtable = new elem* [8];
Guardo con il debugger DDD il valore contenuto negli 8 elementi dell'array e scopro che c'e' 0 (NULL) allora mi chiedo se c'e' un meccanismo automatico di inizializzazione oppure è un puro caso che quelle aree di memoria siano zero.
Il mio scopo è di inizializzare i puntatori dell'array a NULL ma vedo che lo sono già.

3 Risposte

  • Re: Array di puntatori : inizializzazione

    Non esiste nessuna specifica che obbliga un compilatore ad inizializzare la memoria allocata con l'operatore new (ma vale anche per malloc). Dunque, non c'è nessuna garanzia che quei valori siano a zero. Li devi assegnare tu, in modo esplicito.

    Un programmino funziona bene perché trova per caso i puntatori a zero anche se non sono stati inizializzati. Magari verrà usato un giorno per far volare un aereo e infine un'intera flotta di quegli aerei volerà bene grazie ad esso, ...fin quando su uno di questi voli accadrà un evento mai accorso in precedenza che causerà un valore non zero in quella allocazione di memoria, provocando un disastro. Ora, ammesso che eventuali indagini possano individuare la responsabilità nel software, vai tu a trovare il bug non potendolo replicare! Dunque: inizializzare sempre a zero i puntatori per i quali è previsto il valore null prima di ogni altro utilizzo.

    La spesa computazionale di una inizializzazione è praticamente inesistente.
  • Re: Array di puntatori : inizializzazione

    Grazie chiarissimo
  • Re: Array di puntatori : inizializzazione

    Non concordo
    malloc() del 'C' non inizializza, è vero
    Ma calloc() inizializza esplicitamente a zero
    E in 'C++' new() non solo inizializza a zero, ma per le classi chiama il costruttore
    E questo è garantito dal linguaggio
Devi accedere o registrarti per scrivere nel forum
3 risposte