scrittura
MyStruct *s = malloc(sizeof(*s));
ha esattamente lo stesso effetto di
MyStruct *s = malloc(sizeof(MyStruct));
eccetto che ora scrivi solo MyStruct una volta. Cioè, l'oggetto che stai allocando ha la sua fonte tipo determinata automaticamente, che riduce le possibilità di errori.
Ad esempio, è successo a me: si inizia con un MyStruct
. Quindi decidi di aver bisogno di un diverso MyStruct
per diversi scopi. Quindi finisci con due strutture diverse, MyStruct
e AnotherStruct
.
Poi si refactoring del codice e modificare alcune variabili MyStruct
-AnotherStruct
, e finisce con
AnotherStruct *s = malloc(sizeof(MyStruct));
che potrebbe effettivamente funzionare in diverse circostanze, o per un lungo periodo di tempo, fino a fare un altro po 'e , a quel punto, cambiamento completamente indipendente in entrambe le strutture. A che punti il tuo codice va kaboom.
E.g.
typedef struct {
int a;
int b;
} StructA;
typedef struct {
int a;
int b;
int c;
} StructB;
int main() {
// No problem here except wasted space
StructA *s = malloc(sizeof(StructB));
// t->c dwells in undefined country
StructB *t = malloc(sizeof(StructA));
}
Si consiglia di eseguire questa operazione per eseguire il cast esplicito. http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – AntonH
Sì, è valido e consigliato. –
@AntonH non si tratta di trasmettere il risultato – SomeWittyUsername