[alloc] Lecture d'un fichier
Bonjour
Voilà fort longtemps que je n'ai plus fait de C. Donc, veuillez d'ores et déjà excuser la naïveté sans doute de la question.
Voici mon problème, je veux lire un fichier et stocker une (grosse) partie de son contenu en mémoire. Je précise que c'est un fichier texte :
Code:
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
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void setSequence(char *filename){
int SIZE = 512;
char ligne[SIZE];
char *Sequence = (char *)malloc(SIZE*sizeof(char));
if(Sequence==NULL){
fprintf(stderr, "Memory allocation error !\n");
exit(2);
}
FILE *file = fopen(filename, "r");
if(file==NULL){
fprintf(stderr, "Can not access to %s\n", filename);
exit(3);
}
while(fgets(ligne, sizeof ligne, file)){
if(ligne[0] != '>')
{
strcat(Sequence, ligne);
char *tmp = (char *)malloc(SIZE*sizeof(char));
if(tmp==NULL){
fprintf(stderr, "Memory allocation error !\n");
exit(2);
}
SIZE*=2;
tmp = Sequence;
Sequence = (char *)realloc(Sequence, SIZE*sizeof(char));
if(Sequence==NULL){
fprintf(stderr, "Memory allocation error !\n");
exit(2);
}
Sequence = tmp;
free(tmp);
}
}
printf("%s\n", Sequence);
} |
Or, à l'exécution de mon code, je reçois l'erreur suivante :
Code:
1 2 3
|
*** glibc detected *** double free or corruption (!prev): 0x0804a008 ***
Abandon |
Bon, apparemment, il y a un stress dans mes allocations mémoires. Quelle peut bien être mon erreur ?
Merci d'avance de vos réponses.
@++
Re: [alloc] Lecture d'un fichier
Ok je vais venir descendre un peu ton premier code mais c'est pour ton bien, ne m'en veux pas trop :wink:
Donc ton erreur venait d'une mauvaise gestion de tes pointeurs...
Déjà quelques remarques sur ta programmation C:
Code:
1 2
|
char *Sequence = (char *)malloc(SIZE*sizeof(char)); |
On ne fait plus de cast après un malloc en C...
Ensuite puisque c'est des char que tu veux, ceci suffit:
Code:
1 2
|
char *Sequence =malloc(SIZE); |
Ensuite, puisque c'est une taille fixe, effectivement, une déclaration statique est plus intelligente...
Mais le vrai problème vient d'ici (j'ai viré les tests après les malloc/realloc):
Code:
1 2 3 4 5 6 7 8 9 10
|
strcat(Sequence, ligne);
char *tmp = (char *)malloc(SIZE*sizeof(char));
SIZE*=2;
tmp = Sequence;
Sequence = (char *)realloc(Sequence, SIZE*sizeof(char));
Sequence = tmp;
free(tmp); |
Tu viens d'allouer une zone mémoire pour tmp, tu perds cette adresse parce que tu copies la valeur du pointeur Sequence. Après le realloc, tu remets la valeur du pointeur tmp qui est maintenant sûrement invalide, du coup tu perds également la nouvelle zone mémoire de Sequence et ensuite tu fais un free sur tmp.
En gros, en l'espace de 4 instructions, tu viens de rendre 2 variables inutilisables, de perdre 2 zones mémoires allouées dynamiquement et tu viens de faire un free sur un pointeur qui n'est plus valide... :cfou:
Il faudra réviser un peu ta gestion de pointeurs... :wink:
Jc