[Résolu]Probleme avec des pointeur de structure

Probleme avec des pointeur de structure [Résolu] - C - Programmation

Marsh Posté le 28-06-2009 à 00:40:29    

Bonsoir,  
 
j'essiae de coder un projet pour un cours de programmation mais pas moyen de faire fonctinner les pointeur de struture.
J'ai défini une structure bdf comme ceci:

Code :
  1. typedef struct {
  2. int nbfaits;
  3. condition * fait;
  4. }BDF;


je l'initialise:

Code :
  1. BDF * pbdf;
  2. charger_BDF("BDF.txt", pbdf);


 
avec la fonction:

Code :
  1. void charger_BDF(char * nom_base, BDF * bdf)
  2. {
  3. int nbf, i;
  4. FILE* fic = fopen(nom_base, "r" );
  5. fscanf(fic, "%d", &nbf);
  6. printf("nbfaits=%d\n", nbf);
  7. bdf->nbfaits = nbf;
  8. printf("avant malloc\n" );
  9. bdf->fait = (condition *) malloc(nbf*sizeof(condition));
  10. printf("ampres malloc\n" );
  11. for(i=0; i< nbf; i++)
  12. {
  13.   fscanf(fic,"%s", bdf->fait[i].condition);
  14.   fscanf(fic,"%d", bdf->fait[i].verif);
  15. }
  16. fclose(fic);
  17. }


 
La compilation se passe sans accrochage mais lors de l'execution j'obtiens un erreur de segmentation certainement due a l'utilisation de -> , par exemple dans  
bdf->nbfaits = nbf;
 
Je cherche desesperement la solution a ce probleme.
Merci d'avance pour votre aide, je suis vraiment bloqué.


Message édité par screugneugneu2009 le 28-06-2009 à 11:29:55
Reply

Marsh Posté le 28-06-2009 à 00:40:29   

Reply

Marsh Posté le 28-06-2009 à 00:47:48    

Bah, quand tu déclares ton pointeur, tu ne l'initialise pas. Donc forcément si tu tentes d'accèder aux champs par la suite, c'est un SEGFAULT garanti.
 
Deux solutions :

Code :
  1. BDF pbdf;
  2. charger_BDF("BDF.txt", &pbdf);

ou

Code :
  1. BDF * pbdf = calloc(sizeof *pbdf, 1);
  2. charger_BDF("BDF.txt", pbdf);

Reply

Marsh Posté le 28-06-2009 à 09:09:00    

ou mieux, faire un calloc dans charger_BDF

Reply

Marsh Posté le 28-06-2009 à 11:19:21    

Ok, merci pour la reponse c'etait effectivement ça.
Je viens de corriger.


Message édité par screugneugneu2009 le 28-06-2009 à 11:29:33
Reply

Sujets relatifs:

Leave a Replay

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