web-dev-qa-db-fra.com

Pourquoi le livre "Le langage de programmation C" dit-il que je dois lancer malloc?

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?

152
Michi

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 un char *. Le nouveau void * 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.

207
David Ranieri