La question est: “faut-il caster le retour de malloc ?”
Ma réponse est “non”.
Bien sûr j'imagine que tout le monde ne sera pas d'accord avec moi :)

Explication simple

Lorsqu'on cast, on enlève la possibilité au compilateur de nous prévenir d'une erreur de code et donc d'un possible bug.

Explication détaillée

Historique

Dans les temps anciens le prototype de malloc était :

char *malloc(int size);

c'est à dire qu'elle retournait un char *, le void * n'existait pas. C'est la raison pour laquelle il fallait caster.

De nos jours, le prototype de malloc est :

void *malloc(size_t size);

le cast s'effectue implicitement lors de l'affectation et est donc inutile:

char *c = malloc(sizeof(*c) * 42);

Raison 1

Dans le cas où malencontreusement (et ça arrive plus souvent qu'on ne l'imagine), on oublie l'include du prototype de la fonction malloc (stdlib.h), et si on a casté explicitement le retour d'un malloc, le compilateur ne donnera pas de warning. Lorsque le prototype d'une fonction n'est pas connu, le compilateur considère par défaut qu'elle retourne un int, on se retrouve donc avec un une fonction malloc qui retourne un int que l'on caste.

/* oublie #include <stdlib.h> */
char *c = (char *)malloc(sizeof(*c) * 42);

Raison 2

Lors du refactoring d'un code cela peut éviter d'oublier de modifier les cast, par exemple:

char *c;
c = (char *)malloc(sizeof(char) * 42);

Si on désire changer le type de c en int, il faut penser à modifier le type de la variable à 3 endroits:

int *c; /* 1 */
c = (int *)malloc(sizeof(int) * 42); /* 2 et 3 */

Alors que si on avait eu:

char *c;
c = malloc(sizeof(*c) * 42);

on aurait seulement eu à changer la première occurrence du type:

int *c; /* 1 */
c = malloc(sizeof(*c) * 42); /* On ne change rien sur cette ligne */

Conclusion

Au final on fait comme on veut, mais faut juste savoir pourquoi on le fait.

c/caster_malloc.txt · Last modified: 2010/01/12 13:29 (external edit)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0