SIGABRT sur un fclose

Résolu/Fermé
Dayan42 Messages postés 18 Date d'inscription lundi 23 décembre 2013 Statut Membre Dernière intervention 9 août 2015 - Modifié par Dayan42 le 26/04/2015 à 21:00
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 28 avril 2015 à 10:45
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 avril 2015 à 21:37
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 lundi 23 décembre 2013 Statut Membre Dernière intervention 9 août 2015
Modifié par Dayan42 le 26/04/2015 à 21:49
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 avril 2015 à 23:32
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 vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
28 avril 2015 à 10:45
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