Aujourd'hui, j'ai atteint la page 167 de Le langage de programmation C (deuxième édition, Brian W. Kernighan et Dennis M. Ritchie) et trouvé que l'auteur dit que je dois lancer malloc
. Voici la partie du livre:
7.8.5 Gestion du stockage
Les fonctions malloc et calloc obtiennent des blocs de mémoire de manière dynamique.
void *malloc(size_t n)
renvoie un pointeur sur n octets de mémoire non initialisée, ou NULL si la demande ne peut être satisfaite.
void *calloc(size_t n, size_t size)
renvoie un pointeur sur suffisamment d'espace libre pour un tableau de n objets de la taille spécifiée, ou NULL si la demande ne peut être satisfaite. Le stockage est initialisé à zéro. Le pointeur renvoyé par malloc ou calloc a le bon alignement pour l'objet en question, mais il doit être converti dans le type approprié, comme dans
int *ip; ip = (int *) calloc(n, sizeof(int));
Je sais déjà que malloc
(et sa famille) renvoie le type void * , et il existe de bonnes explications, pourquoi ne pas cast malloc
.
Mais ma question est: pourquoi le livre dit-il que je devrais le lancer?
De http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :
Dans les versions antérieures à ANSI C - comme décrit dans K & R-1 - malloc () a retourné un
char *
et il était nécessaire de convertir sa valeur de retour dans tous les cas où la variable de réception n'était pas aussi unchar *
. Le nouveauvoid *
type dans Standard C rend ces contorsions inutiles.Pour éviter à quiconque de l'embarras de devoir sauter inutilement à la défense de K & R-2, j'ai demandé à Dennis Ritchie un avis que je pourrais citer sur la validité de la phrase citée ci-dessus à la page 142. Il a répondu:
En tout cas, maintenant que je relis le contenu sur p. 142, je pense que c'est faux; il est écrit de manière à ne pas être uniquement défensif par rapport aux règles précédentes, mais à ne pas représenter les règles ANSI.