SIGABRT sur un fclose

Résolu
Dayan42 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention   -  
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
je code un projet d'intelligence artificielle en C.
Dans une fonction, j'ouvre un fichier de mots considérés comme inutiles (pronoms, déterminants...) et je mets chaque mot dans un tableau de chaines. D'un moment à l'autre, mon programme ne marche plus : sigabrt lorsque je fais le fclose... je ne suis pas débutant et je ne vois pas d'où ca peut venir. Je sais que fopen fais des malloc et que fclose des free et qu'il y a des soucis la dedans car ca plante sur :
 *** Error in `./jacek': free(): invalid next size (normal): 0x00000000024b9130 ***

mais je ne vois pas ou.. voici le coeur de ma fonction :


if(fichier != NULL){
i = 0;
while(fgets(buff,TAILLE_MOT,fichier) != NULL){
strcpy(tab_char[i] , buff);
i++;
}
fclose(fichier);
}else{
fprintf(stdout, "Erreur du chargement du fichier liste_useless.txt\n");
exit(EXIT_FAILURE);
}



2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Je sais que fopen fais des malloc et que fclose des free
Euh non... Ni l'un, ni l'autre.

Pourrais-tu montrer ton programme en entier ? Notamment la partie qui définie buff, fichier et tab_char.
0
Dayan42 Messages postés 18 Date d'inscription   Statut Membre Dernière intervention  
 
Bah pas directement fopen peut etre mais il y en a forcement vu que l'on charge des octets en mémoire, et fclose en libère donc il y aura des free, et comme montré dans le post l'erreur survient sur un free()..

voici la fonction entiere donc :


void charger_liste_mots_inutiles(char tab_char[NB_MOTS_INUTILES][TAILLE_MOT]){
char buff[TAILLE_MOT];
FILE *fichier = fopen("liste_useless.txt","r");
int i;

if(fichier != NULL){
i = 0;
while(fgets(buff,TAILLE_MOT,fichier) != NULL){
strcpy(tab_char[i] , buff);
i++;
}

fclose(fichier);
}else{
fprintf(stdout, "Erreur du chargement du fichier liste_useless.txt\n");
exit(EXIT_FAILURE);
}
}

je ne peux montrer le programme en entier, j'ai plus de 8 fichiers.c qui font 500 lignes.. mais comme j'ai dit c'est venu d'un moment à l'autre, le programme marchait tres bien cet apres midi
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ce n'est pas parce que l'on charge des octets en mémoire qu'il y a usage de malloc(). Par exemple : int a[2]; tu créées un tableau avec affectation de données en mémoire et il n'y a pas d'usage de malloc()... fopen() retourne juste une structure contenant des données gérées par l'OS. Bref.

Il manque toujours la déclaration des variables demandées. Ce qu'il y a dans le prototype n'est pas suffisant.

Note :
fclose(fichier);
Je te conseille d'initialiser fichier à NULL; juste après. Ce n'est pas obligatoire, mais cela évite les mauvaises surprises.
while(fgets(buff,TAILLE_MOT,fichier) != NULL){
strcpy(tab_char[i] , buff);
i++;
}

Pourquoi ne pas écrire directement dans tab_char[i] ?
0
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   49
 
Bonjour ( & hi @fiddy )
@Dayan42 Ton problème vient clairement de la fonction de délocalisation
 free( void *ptr ) 
ton pointeur doit être corrompu plus précisément a cause d'un écrasement mémoire et je soupçonne ta variable d'incrémentation ' I' il se peut qu'elle soit la cause de ton erreur.
Quant à "sigabrt" c'est une de tes fonctions ou bibliothèque qui y a fait appel grâce à la fonction abort().
à bientôt

0