IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Erreur incompréhensible.. (seg. fault)


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 16
    Points
    16
    Par défaut Erreur incompréhensible.. (seg. fault)
    Bonjour, en général j'arrive à régler seul les erreurs de segmentation qui découlent souvent d'erreurs d'inattention mais là je dois avouer que je n'y comprend rien, mais alors absolument rien...

    Je vous met le code concerné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    //Définition de ma structure :
    typedef struct trajet *Trajet;
    struct trajet
    {
    	int ligne;
    	int v_a;
    	int h_d;
    	int h_a;
    	Trajet suivant;
    };
     
    //Declaré en variable globale :
    Trajet *Liste;
     
    //Dans la fonction qui plante
    if(Liste[0]==NULL) printf("OK\n");
    h_d=lire_horaire();
    if(Liste[0]==NULL) printf("OK\n");
     
    //Et la fonction lire_horaire() :
    int lire_horaire()
    {
    	int h_t;
    	int heures;
    	int minutes;
    	char trash='h';
    	fscanf(fichier, "%2d", &heures);
    	fscanf(fichier, "%1s", &trash);
    	fscanf(fichier, "%2d", &minutes);
    	h_t=60*heures+minutes;
    	return h_t;
    }
    Ici le premier test sur Liste[0] permet bien d'afficher "OK", mais le deuxième provoque une segmentation fault...
    Or si je peux le tester avant de lancer ma fonction lire_horaire() qui n'a rien à voir avec ce tableau Liste, pourquoi ne le puis-je plus après ?

    Si quelqu'un à une idée je suis preneur, je commence à désespérer...

    Merci d'avance !

    Adrien.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Je peux me tromper, mais ça sent le débordement de tampon. Des bugs sans queue ni tête de cette nature ont souvent cette origine. Toutefois, souvent ne veut pas dire toujours...
    Un débordement (en fonction de là où il se situe) peut modifier une autre variable, ou même éventuellement le registre EBP empilé sur la pile. Et une fois que la fonction se termine... bing !

    Y a déjà un beau débordement ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char trash='h';
    ...
    fscanf(fichier, "%1s", &trash);
    La fonction rajoute un '\0' après le caractère. Vu que la variable ne fait qu'un byte, ça déborde d'un byte... et ça écrase ce qui s'y trouve (une autre variable, un registre de pile précédemment empilé... )

    Formateur "%s" :
    * s'arrête au premier caractère "blanc" (sauf si l'on a précisé une longueur de champ, et que celle-ci est atteinte avant un blanc.)
    * supprime les espaces lors de l'analyse
    * ajoute un terminateur de chaîne (caractère '\0') de façon automatique.
    Je ne dis pas que ton problème vient forcément de là, mais c'est déjà un débordement, avec toutes les conséquences que ça peut occasionner.

    Par contre, rien à voir, mais ça sent les globales à plein nez. Les globales sont la plupart du temps injustifiées et sont susceptibles elles aussi de rendre le code indebuggable (n'importe quelle fonction peut changer n'importe quoi).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 16
    Points
    16
    Par défaut
    C'est surement ça j'ai voulu gagner du temps en déclarant

    je pensais que ça prendrait automatiquement en compte le \0 en créant un tableau de 2 char, mais après reflexion ....

    Pour ce qui est des variables globales j'ai d'abord essayé avec 100% des variables en local puis j'en ai passé quelques unes en global pour voir si ça influait sur mon problème mais c'était sans effet je vais donc tout pouvoir repasser en local.

    Merci de ta réponse rapide, je vais de ce pas vérifier si ça résoud mon problème !

    Edit : en effet ! bien vu et encore merci,

    Si jamais la modif que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //dans lire_horaire()
    char *trash=NULL;
    trash=malloc(2*sizeof(char));

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pourquoi faire de l'allocation dynamique ? Il suffit de
    ou même, puisque trash n'est pas utilisé ensuite, ne pas stocker ce champ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	fscanf(fichier, "%2d", &heures);
    	fscanf(fichier, "%*1s");
    	fscanf(fichier, "%2d", &minutes);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. [fclose] erreur de fermeture (seg fault)
    Par Goundy dans le forum C
    Réponses: 17
    Dernier message: 06/04/2006, 13h16
  2. [2.1][jdk1.3][Junit] Erreur incompréhensible!
    Par Sniper37 dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 29/04/2005, 19h03
  3. Erreur incompréhensible à la ligne 200 (sur 190 ?!)
    Par transistor49 dans le forum Qt
    Réponses: 3
    Dernier message: 22/03/2005, 23h09
  4. [Fichiers] Erreur incompréhensible
    Par Clorish dans le forum Langage
    Réponses: 5
    Dernier message: 14/12/2004, 17h18
  5. [JSP] Erreur incompréhensible
    Par xxaragornxx dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 09/09/2003, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo