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.