malloc, free et structures

malloc, free et structures - C - Programmation

Marsh Posté le 17-03-2004 à 13:09:55    

voila un bout de coude qui m'envoie un segfault à l'appel du destructor
 

Code :
  1. typedef struct Light {
  2. int  id;
  3. ...
  4. } *Light;
  5. Light lightConstructor(int id) {
  6. l=(Light) malloc (sizeof(struct Light));
  7. ...
  8. }
  9. void lightDestructor(Light *l) {
  10. free(l);
  11. }
  12. void foo(void) {
  13. Light l;
  14. l=lightConstructor(1);
  15. ...
  16. lightDestructor(&l);
  17. exit(0);
  18. }


 
il y a un problème sur mon destructor ou sur mon appel ou les 2 ?
 
merci pour les réponses :jap:


Message édité par xav14 le 17-03-2004 à 13:34:52
Reply

Marsh Posté le 17-03-2004 à 13:09:55   

Reply

Marsh Posté le 17-03-2004 à 13:15:36    

Voilà pourquoi les langages impératifs cai le mal :jap:

Reply

Marsh Posté le 17-03-2004 à 13:19:15    

merci pour le troll
(je programme en java normalement mais là il faut que je fasse un truc en c, et mes souvenirs sur les pointeurs sont un peu vagues)

Reply

Marsh Posté le 17-03-2004 à 13:29:17    

l doit être un pointeur sur une struct.
Or, toi tu le déclare comme "Light l;"
Quand tu fais  lightDestructor(&l); tu essayes de détruire une struct qui n'est pas alloué dynamiquement => plantage
 
Il faut écrire "Light *l;" et "lightDestructor(l);"

Reply

Marsh Posté le 17-03-2004 à 13:33:41    

bah le type Light est un pointeur sur struct Light ...
 
l est donc bien un pointeur sur une structure.
 
par contre j'ai oublié la ligne :
 
l=lightConstructor(1);
 
(j'édite)

Reply

Marsh Posté le 17-03-2004 à 13:47:45    

Oups, désolé, j'ai lu trop vite.
 
Le code que tu as filé a l'air bon.
Essaye de voir si ça ne vient pas d'ailleurs (dépassement de capactité d'un tableau par exemple)
 
Va voir là pour un pb similaire :  
http://forum.hardware.fr/forum2.ph [...] 0&subcat=0

Reply

Marsh Posté le 17-03-2004 à 13:53:33    

pascal_ a écrit :

Oups, désolé, j'ai lu trop vite.
 
Le code que tu as filé a l'air bon.
Essaye de voir si ça ne vient pas d'ailleurs (dépassement de capactité d'un tableau par exemple)
 
Va voir là pour un pb similaire :  
http://forum.hardware.fr/forum2.ph [...] 0&subcat=0
 


 
Argh, je raconte encore des conneries.
Ton code est pas bon.
 
lightDestructor(&l); => tu passes donc un pointeur sur un pointeur de struc Light.
Donc le free(l) essaye de désallouer le pointeur sur ta struct.
 
Edit :  
donc soit tu écris :

Code :
  1. void lightDestructor(Light l) {
  2.   free(l);
  3. }
  4. et
  5. lightDestructor(l)


 
soit  
 

Code :
  1. void lightDestructor(Light *l) {
  2.   free(*l);
  3.   *l = NULL; // par exemple ou *l=0; pour certain
  4. }
  5. et
  6. lightDestructor(&l);


 


Message édité par pascal_ le 17-03-2004 à 13:57:01
Reply

Marsh Posté le 17-03-2004 à 16:47:34    

ok
 
il me semblait que ta première solution est celle que j'avais faite au départ :heink:

Reply

Sujets relatifs:

Leave a Replay

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