Pourquoi le livre «The C Programming Language» dit-il que je dois lancer malloc?

158

Aujourd'hui, j'ai atteint la page 167 de The C Programming Language (deuxième édition Brian W. Kernighan & Dennis M. Ritchie) et j'ai 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 dynamiquement.

void *malloc(size_t n)

renvoie un pointeur vers n octets de stockage non initialisé, ou NULL si la demande ne peut pas être satisfaite.

void *calloc(size_t n, size_t size)

renvoie un pointeur vers suffisamment d'espace libre pour un tableau de n objets de la taille spécifiée, ou NULL si la requête ne peut pas être satisfaite. Le stockage est initialisé à zéro. Le pointeur retourné par malloc ou calloc a le bon alignement pour l'objet en question, mais il doit être casté 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 y a de bonnes explications pourquoi ne pas lancermalloc .

Mais ma question est: pourquoi le livre dit-il que je devrais le lancer?

Michi
la source
125
Parce que le livre est vieux.
Oliver Charlesworth
12
Parce que même le soleil a ses taches sombres, serait ma réponse. En d'autres termes, le livre est faux. Il se peut que le texte soit antérieur à la sémantique void *et n'ait pas été mis à jour. Voir aussi cette réponse .
détendre le
8
@Michi Le livre comporte de nombreuses erreurs factuelles et typographiques (google K&R errata), il n'est que quelque peu compatible avec le standard C90, il ne traite pas du standard C actuel ni des changements de langage depuis 1990. Pire encore, il est rempli de mauvaise pratique de programmation, mauvais style et code qui repose sur un comportement mal spécifié. Tout ce que vous devez désapprendre si vous devenez un programmeur C professionnel.
Lundin le
8
... et comparez cela avec Pourquoi le compilateur se plaint-il quand je ne lance pas le résultat de malloc? Donc, pour C - ne lancez pas. Pour C ++ - cast, mais ne l'utilisez pas malloccar ce n'est PAS du C ++ - sauf lorsque vous devez le faire - mais vous ne devriez pas - sauf ... AGGGHHHHHH !!!!! :-)
Bob Jarvis - Réintégrer Monica le
2
@Mandrill avez-vous lu ma question? J'ai dû modifier ma question pour vous.
Michi

Réponses:

215

Depuis http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

Dans le pré-ANSI C - comme décrit dans K & R-1 - malloc () a renvoyé a char * et il était nécessaire de convertir sa valeur de retour dans tous les cas où la variable réceptrice n'était pas également a char *. Le nouveau void *type de la norme C rend ces contorsions inutiles.

Pour sauver qui que ce soit de l'embarras de sauter inutilement à la défense de K & R-2, j'ai demandé à Dennis Ritchie une opinion que je pourrais citer sur la validité de la phrase citée ci-dessus à partir de la page 142. Il a répondu:

En tout cas, maintenant que j'ai relu les choses à la p. 142, je pense que c'est faux; il est écrit de telle manière qu'il n'est pas seulement défensif contre les règles antérieures, il déforme les règles ANSI.

David Ranieri
la source
23
Ainsi, le type de retour de malloc était char et non vide . Je vous remercie.
Michi
10
Il est également mentionné dans l'errata web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/…
nos
18
Vous ne devez pas lire ce livre sans cet errata imprimé sur un (des) papier (s) à côté de vous.
Lundin le
4
@Michi - non, le type de retour était char*, non char. Les deux sont très différents.
Pete Becker
20
@alk: exactement. En lisant K&R, vous écoutez deux gourous, ce qui est suffisant ;-)
Steve Jessop