Se ti piace la mentalità "non ripeterti", dovrebbe essere attraente che non sia necessario ripetere il nome del tipo dalla dichiarazione della variabile, nella chiamata malloc()
. Perché, come ha sottolineato la gente, non è così: i puntatori vengono convertiti in e da void *
senza perdita, ad eccezione dei puntatori di funzione.
Inoltre, in questa nota, non è necessario ripetersi con l'uso di sizeof
. Il tuo secondo esempio, in sede di assegnazione di una struttura, può essere scritto in questo modo:
struct node *temp;
temp = malloc(sizeof *temp);
che a mio modesto parere, non così è il miglior modo .
Evitare di ripetere te stesso riduce il numero di cose che scrivi, il che a sua volta riduce il rischio che una di quelle cose sia sbagliata.
Nota l'asterisco nell'argomento sizeof
, che significa "la dimensione dell'oggetto puntato da questo puntatore", che è ovviamente uguale alla "dimensione del tipo struct node
" ma senza ripetere il nome del tipo. Questo perché sizeof
calcola (in fase di compilazione!) La dimensione dell'espressione che è il suo argomento. Per questo caso. Proprio come sizeof 3
calcola la dimensione di un'espressione di tipo int
, sizeof *temp
calcola la dimensione di un'istanza di struct node
.
Certo, si fa ripetere qualcosa, vale a dire il nome della variabile stessa, ma che è spesso un'espressione semplice e più facile da ottenere, e può anche essere più facile per il compilatore individuare un errore.
Se è necessario compilare il codice con un compilatore C++ anziché con un compilatore C, è necessario il cast. Di conseguenza, la maggior parte del mio codice include il cast esplicito, anche se la pura C non lo richiede. Di solito lo taggo con/* = C++ = */per indicare perché. –
Anche se non necessario, per me mi aiuta a leggere il codice in seguito con poca verbosità. – Xolve
Vedere anche [questa domanda] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858). – unwind