SIGABRT sur un fclose
Résolu
Dayan42
Messages postés
21
Statut
Membre
-
sambia39 Messages postés 610 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 :
mais je ne vois pas ou.. voici le coeur de ma fonction :
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
-
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.-
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 -
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] ?
-
-
Bonjour ( & hi @fiddy )
@Dayan42 Ton problème vient clairement de la fonction de délocalisationfree( 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