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

==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 concernée

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;
}
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
char **create(int n)
{
    char **tab = NULL;
 
    tab = malloc(sizeof(char *) * n);
    if (tab == NULL)
        exit(EXIT_FAILURE);
 
    return tab;
}
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
void freec(char **tab, int taille)
{
    int i;
    for (i=0; i<taille; i++)
        if(tab[i] != NULL)
            free(tab[i]);
}
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
8
char **res = create(nb_line);
 
t = read(fic, res, nb_line);
 
/* ... */
 
freec(res, t);
free(res);
Je ne vois vraiment d'où vient cette erreur, merci par avance pour vos éclaircissements.