Bonjour,
J'ai un code qui fonctionne très bien, pas d'erreur de libération mémoire, mais valgrind insiste sur une erreur sans doute "technique".
Pas d'erreur sur un compilateur très rigoureux, je travaille avec la C89.
Voici l'erreur
La fonction concernée==5683== Address 0x42da226 is 0 bytes after a block of size 14 alloc'd
==5683== at 0x4028308: malloc (vg_replace_malloc.c:263)
==5683== by 0x41EDE1F: strdup (strdup.c:43)
==5683== by 0x8048A88: read (fichier.c:91)
==5683== by 0x418BE45: (below main) (libc-start.c:228)
La fonction permettant de créer le tableau à deux dimensions
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 int read(FILE *f, char **tab, int lines) { char *p = NULL; char line[MAX]; int i, j=0; for (i=0; i<lines; i++) { p = fgets(line, MAX, f); if (p != NULL) { p = strchr(line, '\n'); if (p != NULL) *p = '\0'; if (!is_present(tab, line, j)) { tab[j] = strdup(line); if (tab[j] == NULL) { fprintf(stderr, "Error allocation"); exit(EXIT_FAILURE); } j += 1; } } } fclose(f); return j; }
Je rajoute la fonction de libération avant un free(res) ou res est le tableau de tableau de chars.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 char **create(int n) { char **tab = NULL; tab = malloc(sizeof(char *) * n); if (tab == NULL) exit(EXIT_FAILURE); return tab; }
L'utilisation dans le main, qui n'aidera sans doute pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void freec(char **tab, int taille) { int i; for (i=0; i<taille; i++) if(tab[i] != NULL) free(tab[i]); }
Je ne vois vraiment d'où vient cette erreur, merci par avance pour vos éclaircissements.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 char **res = create(nb_line); t = read(fic, res, nb_line); /* ... */ freec(res, t); free(res);
![]()
Partager