Cast malloc : A faire ou pas ?

Cast malloc : A faire ou pas ? - C++ - Programmation

Marsh Posté le 19-03-2003 à 23:01:11    

B'soir
 
Un probleme me turlupine quant à la reelle utilité du "castage" de malloc ...  
Les regles du C veulent que l'on cast le malloc, mais j'ai lu sur dans de nombreux endroits, et sur des sites très serieux, que c'etait inutile voir carrément a éviter parfois.  
 
En prenant en compte le fait que le compilateur ne fasse aucune remarque quant on ne le cast pas, quelle est la solution optimale ?? Mici !

Reply

Marsh Posté le 19-03-2003 à 23:01:11   

Reply

Marsh Posté le 19-03-2003 à 23:10:46    

Citation :

Les regles du C veulent que l'on cast le malloc


faux. en C les conversion type* <-> void* sont implicites.
 
ca peut etre dangereux de caster par ce que le cast fait taire le compilo. l'erreur la plus courante, c'est do'ublier d'inclure <malloc.h > ou <stdlib.h>, mallo c est donc manquand, le protoype par défaut est donc insérer. en castant, tu te rendras compte à l'execution que ç afoire de partout. sans cast, tu le sauras des la compil.
 
donc pas la peine de le faire, ça surcharge le code pour rien


Message édité par Taz le 19-03-2003 à 23:17:47
Reply

Marsh Posté le 20-03-2003 à 01:18:09    

Quand je parlais des regles du C qui stipulaient de caster le malloc, cetait simplement parce que je lavais lu sur le bouquin ecrit par les créateurs du C ... et sinon merci bien de ton aide :)
 
Pas dautres remarques sur ce probleme ?  :(

Reply

Marsh Posté le 20-03-2003 à 06:44:33    

oui, mias c'est là plus une affaire de gout qu'autre chose en fait
 
edit: et de compilateur: à l'époque de la rédaction du K&R, les compilos bronchaient plus facilement, alors comme dit précédemment, le cast les faisait taire. mais aujourd'hui, pas besoin, les compilos modernes sont au courant de la norme


Message édité par Taz le 20-03-2003 à 06:58:23
Reply

Marsh Posté le 20-03-2003 à 07:05:29    

Je serai plutôt partisan de caster, car:
-Il est possible qu'une future version de C n'accepte plus la conversion de pointeur implicite.
-Ça rends le source compatible C++.
 
Je rapelle que le C actuel n'autorise plus les déclarations implicites.
 
 
De toutes façons je préfères utiliser new en C++.
 
Ok, je sors ->[]


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 20-03-2003 à 12:05:01    

http://www.isty-info.uvsq.fr/~rume [...] 2.html#q_1
 

12.1 Doit-on ou ne doit-on pas caster malloc() ?
Cette question est probablement celle qui revient le plus souvent dans la discussion. Et à chaque fois, elle engendre une longue discussion.  
Certains intervenants pensent que caster la valeur de retour de malloc() est inutile, voire dangereux. En effet, malloc() renvoie un void *. Or, en C, un pointeur void * est implicitement casté lors d'une affectation vers le type de la variable affectée. Bien sûr, expliciter le cast n'est pas interdit, et est parfois utile. Toutefois, caster le retour de malloc() risque de cacher au compilateur l'oubli du prototype de malloc(). Ce prototype se trouve dans le fichier d'en-tête <stdlib.h>. Sans lui, malloc() sera par défaut une fonction retournant un int et dont les paramètres seront du type des arguments passés, ce qui peut provoquer de sérieux bugs.  
 
La véritable erreur est l'oubli du fichier d'en-tête <stdlib.h>, et non pas le cast de malloc() en lui même. Mais le cast de malloc() risque de cacher au compilateur cette erreur. À noter qu'il existe des outils de vérification de code et des options sur la plupart des compilateurs4 qui permettent de détecter ce genre d'erreur.  
 
D'autres intervenants jugent qu'il faille tout de même caster le retour de malloc(), afin de conserver une compatibilité avec d'anciens compilateurs pré-ANSI, ou pour intégrer plus facilement le code avec C++. Evidemment, les programmeurs avertis sauront dans quelles situations il est utile ou non de caster les void *.


Message édité par ToxicAvenger le 20-03-2003 à 12:05:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed