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

POSIX C Discussion :

Un segfault que je ne comprend pas.


Sujet :

POSIX C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut Un segfault que je ne comprend pas.
    Bonjour à tous,
    En TP de prog, on devait créer un programme qui triait les mots contenus dans un fichier.

    Voila le fichier de mots que j'ai utilisé :

    tintin
    asterix
    spirou
    fantasio
    marsupilami
    asterix
    gaston
    spirou
    marsupilami
    tournesol
    tintin
    asterix
    spirou
    marsupilami
    tournesol
    tintin
    asterix
    spirou
    marsupilami
    tintin
    asterix
    tintin
    asterix
    spirou
    marsupilami
    tintin
    asterix
    tintin
    asterix
    spirou



    Et voici le début de mon programme. Je ne vous met que la partie où je charge les différents mots dans un tableau dynamique.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    #define ERR_CANT_OPEN 1
    #define ERR_CANT_ALLOC 2
     
    int main()
    {
    	FILE* lire ;
    	int i,j,nbMots ;
    	char c ; 
    	char** mots=NULL ; /* Ce tableau dynamique contiendra la liste de mots */
    	char* l = "./ToBeSorted" ;
     
    	/* Ouverture du fichier a trier */
    	lire = fopen(l,"r") ; ;
    	if(lire==NULL)
    		exit(ERR_CANT_OPEN) ;
     
     
    	/* Parcours de lignes du fichier */
    	/* i indique la ligne courante, j le caractère courant */
    	for(i=0 ; !(feof(lire)) ; i++)
    	{
    		j=0 ;
     
    		/* Allocation d'une nouvelle chaine dynamique dans le tableau */
    		mots=realloc(mots,(i+1)*sizeof(char*)) ;
    		if(mots==NULL){
    			exit(ERR_CANT_ALLOC) ;
    		}
    		/*mots[i]=NULL ;*/ /* Decommenter cette ligne pour que le programme marche */
     
    		/* Lecture des caractere de la ligne */
    		c=fgetc(lire) ;
    		while(((c!='\r') && (c!='\n')) && (!feof(lire)))
    		{
    			printf("+++ %d,%d:%c +++\n",i,j,c);
     
    			/* Allocation d'un caratère supplémentaire */
    			mots[i]=realloc(mots[i],(j+1)*sizeof(char)) ; /* <- SEGFAULT */
    			if(mots[i]==NULL){
    				exit(ERR_CANT_ALLOC) ;
    			}
     
    			printf("---\n") ;
     
    			/* Ecriture du caratère */
    			mots[i][j]=c ; 
    			j++ ;
     
    			c=fgetc(lire) ;
    		}
     
    		/* Ajout du '\0' */
    		mots[i]=realloc(mots[i],(j+1)*sizeof(char)) ;
    		if(mots[i]==NULL){
    			exit(ERR_CANT_ALLOC) ;
    		}
    		mots[i][j]='\0' ;
    	}
     
    	nbMots=i ;
    	fclose(lire) ;
     
    	/* traitement de la liste de mots... */
     
    	return 0 ;
    }

    Au moment ou le programme commence à écrire le 21e mot ( en comptant à partir de 0 ), il y a une erreur de segmentation on moment de l'allocation dynamique, ligne 42.
    J'ai résolu ce problème en initialisant mon pointeur ( décommenter la ligne 33 ).
    Bon, je ne suis pas étoné d'avoir eu un problème un faisant un realloc sur un pointeur non initialisé. Ce qui est bizarre, c'est que l'erreur se produit toujours au début du 21eme mot.

    Pourquoi est-ce que tout marche jusqu'au 20e mot, puis bloque en moment d'allouer de la mémoire pour écrire le "t" de "tintin" ?

    Merci de votre aide.

  2. #2
    Expert confirmé
    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
    Par défaut
    Ce qui est bizarre, c'est que l'erreur se produit toujours au début du 21eme mot.
    Pur hasard (le fait que ça semble reproductible n'est pas quelque chose de pertinent; ici c'est au début du 21ieme mot, sur une autre machine, ou demain, ce sera au début d'un autre)
    Si lors de la réallocation de mots, le terme ajouté correspond à une case où il y a zéro (0) tout se passera bien, sinon il y aura plantage.

    Le code
    est impératif pour que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mots[i]=realloc(mots[i],(j+1)*sizeof(char)) ;
    ne plante pas et agisse comme un malloc au premier appel. En son absence, le comportement est imprévisible et tu as la malchance que ça ne plante pas plus tôt.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui, classique.. Sur un plateforme de type PC/unix ou meme windows, les erreurs mémoire comme un mauvais free (ici, mauvais paramètre à realloc, mais c'est pareil) peuvent :
    - ne rien faire de particulier
    - faire crasher l'appli
    - corrompre des données en mémoire (de façon visible ou non)
    - faire faire des choses étranges aux fonctions appelées suivantes
    - ...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut
    J'ai essayé sous deux autres ordi... et le programme plante de la même façon au même moment ! Et ce même si je met des mots plus courts ou plus long.
    Est-ce vraiment le hasard si ça plante au même moment sur tous ?

    ( Au fait, désolé de m'être trompé de section... )

  5. #5
    Expert confirmé
    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
    Par défaut
    Est-ce vraiment le hasard si ça plante au même moment sur tous ?
    Ne te poses même pas cette question, tu perds ton temps; elle n'a pas d'intérêt : le résultat est imprévisible, donc le code est à jeter.
    ( Au fait, désolé de m'être trompé de section... )
    ???

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut
    Citation Envoyé par diogene Voir le message
    Ne te poses même pas cette question, tu perds ton temps; elle n'a pas d'intérêt : le résultat est imprévisible, donc le code est à jeter.
    Je sais bien, mais je me demande quand même ce qui peut bien se passer pour que le programme plante pile au 21e mot, et ce quelque soit l'ordi...

    Citation Envoyé par diogene Voir le message
    ???
    Ma question n'a rien à voir avec POSIX.

Discussions similaires

  1. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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