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 : 42
    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