IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Erreur strdup valgrind


Sujet :

C

  1. #1
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut Erreur strdup valgrind
    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.

    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  2. #2
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    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;
    }
    J'ai déjà vu une fonction de création dynamique d'un tableau à 2 dimensions se faire comme ceci mais la tienne ne m'a pas forcément l'air fausse...
    Le malloc te renvoie l'adresse de là où a été créé ton tableau. Or tu ne vérifies pas que la seconde dimension existe vraiment? A vérifier ^^

    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
    char **create(int n1, int n2)
    {
        char **tab = NULL;
        int i;
     
        tab = malloc(sizeof(char *) * n1);
        for(i=0; i<n2; i++)
        {
            tab[i]=malloc(sizeof(char)*n2);
        }
        if (tab == NULL)
            exit(EXIT_FAILURE);
     
        return tab;
    }

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Merci pour ta réponse, mais en fait strdup malloc déjà, du coup je n'ai pas besoin de le faire lors de ma création du tableau à 2 dimensions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (!is_present(tab, line, j))
    {
        tab[j] = strdup(line);
        if (tab[j] == NULL)
        {
            fprintf(stderr, "Error allocation");
            exit(EXIT_FAILURE);
        }
        j += 1;
    }
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Justement, j'ai hésité à le mettre dans le post d'avant mais j'ai pas trouvé plus de détails que cela.
    Quand tu copies ta ligne via strdup, tu ne fais pas attention au nombre de caractères que tu introduis. Du coup, tu vas avoir effectivement un tableau à 2 dimensions mais celui ci va contenir, imaginons:

    1ère ligne: 3 caractères
    2ème ligne: 12 caractères
    3ème ligne: 9 caractères
    4ème ligne: 26 caractères
    etc etc

    Enfin, ça me gène mais j'ai pas trouvé plus d'infos pour étayer ce point là ^^

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    La valeur MAX est de 200, j'ai spécialement pris un nombre suffisamment important pour être tranquille de ce côté, mais j'ai tout de même vérifier que je ne dépasse pas cette valeur, cela sans succès

    Tu me diras c'est pas grave, tout fonctionne, mais j'aime bien quand mon valgrind me dit que je suis parfait.

    En fait j'ai deux erreurs sur Valgrind, je pensais que celle-ci provoquait l'autre, mais peut-être que c'est l'inverse.

    Du coup je met les deux messages d'erreur

    ==5971== Invalid read of size 1
    ==5971== at 0x4028A53: strlen (mc_replace_strmem.c:390)
    ==5971== by 0x8048C57: write (fichier.c:155)
    ==5971== by 0x8048807: main (fichier.c:29)
    ==5971== Address 0x42da226 is 0 bytes after a block of size 14 alloc'd
    ==5971== at 0x4028308: malloc (vg_replace_malloc.c:263)
    ==5971== by 0x41EDE1F: strdup (strdup.c:43)
    ==5971== by 0x8048ABC: read (fichier.c:95)
    ==5971== by 0x418BE45: (below main) (libc-start.c:228)
    Je met donc l'autre fonction concernée et la fonction is_present

    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
    33
    34
    35
    int is_present(char **tab, char *chaine, int taille)
    {
        int i, n;
     
        if (taille == 0)
            return 0;
     
        for (i=0; i<taille; i++)
        {
            n = strcmp(tab[i], chaine);
            if (n == 0)
                return 1;
        }
     
        return 0;
    }
     
    void write(FILE *f, char **tab, int taille)
    {
        char *p = NULL;
        int i;
        size_t n;
     
        for (i=0; i<taille; i++)
        {
            p = strchr(tab[i], '\0');
            if (p != NULL)
                *p = '\n';
     
            n = strlen(tab[i]);
            fwrite(tab[i], 1, n, f);
        }
     
        fclose(f);
    }
    Plus, vous aurez le droit en prime à tester le code, qui supprime les doublons d'un fichier

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define MAX 200
     
    int count(FILE *f); /* compte le nombre de lignes */
    char **create(int n); /* Crée le tableau à deux dimensions */
    FILE *open(char *name, char *mode); /* Ouverture sécuritaire du fichier */
    int read(FILE *f, char **tab, int lines); /* Lis et ajoute les lignes dans le tableau */
    void display(char **tab, int taille); /* Affiche le tableau */
    void freec(char **tab, int taille); /* libération mémoire de chaque chaine */
    int is_present(char **tab, char *chaine, int taille); /* vérifier la présence de chaine dans tab */
    void write(FILE *f, char **tab, int taille);
     
    int main(void)
    {
        FILE *fic = open("test.txt", "r");
        int nb_line = count(fic);
        int t;
     
        char **res = create(nb_line);
     
        t = read(fic, res, nb_line);
     
        display(res, t);
     
        fic = open("test_cp.txt", "w");
        write(fic, res, t);
     
        freec(res, t);
        free(res);
     
        return 0;
    }
     
    char **create(int n)
    {
        char **tab = NULL;
     
        tab = malloc(sizeof(char *) * n);
        if (tab == NULL)
            exit(EXIT_FAILURE);
     
        return tab;
    }
     
    FILE *open(char *name, char *mode)
    {
        FILE *file = fopen(name, mode);
        if (file == NULL)
        {
            perror("");
            exit(EXIT_FAILURE);
        }
     
        return file;
    }
     
    int count(FILE *f)
    {
        char *p = NULL;
        char line[MAX] = {0};
        int counter = 0;
     
        while ((p=fgets(line, MAX, f)) != NULL)
            counter += 1;
     
        fseek(f, 0, 0);
     
        return counter;
    }
     
    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;
    }
     
    void display(char **tab, int taille)
    {
        int i;
        for (i=0; i<taille; i++)
            printf("%s\n", tab[i]);
    }
     
    void freec(char **tab, int taille)
    {
        int i;
        for (i=0; i<taille; i++)
            if(tab[i] != NULL)
                free(tab[i]);
    }
     
    int is_present(char **tab, char *chaine, int taille)
    {
        int i, n;
     
        if (taille == 0)
            return 0;
     
        for (i=0; i<taille; i++)
        {
            n = strcmp(tab[i], chaine);
            if (n == 0)
                return 1;
        }
     
        return 0;
    }
     
    void write(FILE *f, char **tab, int taille)
    {
        char *p = NULL;
        int i;
        size_t n;
     
        for (i=0; i<taille; i++)
        {
            p = strchr(tab[i], '\0');
            if (p != NULL)
                *p = '\n';
     
            n = strlen(tab[i]);
            fwrite(tab[i], 1, n, f);
        }
     
        fclose(f);
    }
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Dans votre read :
    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;
    }
    char line[MAX]; n'est pas initialisé...
    MAIS ! Juste après lui avoir copié MAX - 1 caractères (fgets est limité), vous faites : p = strchr(line, '\n'); qui s'attend à voir un '\0' qui ne vient pas !
    Essayez de faire :
    A l'initialisation, ou de faire un memcpy de '\0'.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ce n'est en fait qu'une seule et même erreur.

    Ton problème vient de ces lignes du write :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p = strchr(tab[i], '\0');
    if (p != NULL)
        *p = '\n';
     
    n = strlen(tab[i]);
    Tu as, comme te l'indique Valgrind, fait un strdup d'une chaîne de longueur 14. Donc 13 caractères + le '\0' final.
    Mais ici, en inverse de la lecture, tu remplaces ce '\0' final par le caractère de fin de ligne '\n'.
    Puis tu souhaites trouver sa longueur... Mais où est passé le '\0' final qui indique sa fin ? Tu viens de le remplacer par autre chose.
    strlen va donc continuer à lire dans un espace non réservé jusqu'à trouver un '\0' on ne sait où

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Avec char line[MAX] = {0}, toujours les deux même erreurs avec valgrind

    Pour l'autre solution d'autres erreurs en ayant un code tout autant fonctionnel

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define MAX 200
     
    int count(FILE *f); /* compte le nombre de lignes */
    char **create(int n); /* Crée le tableau à deux dimensions */
    FILE *open(char *name, char *mode); /* Ouverture sécuritaire du fichier */
    int read(FILE *f, char **tab, int lines); /* Lis et ajoute les lignes dans le tableau */
    void display(char **tab, int taille); /* Affiche le tableau */
    void freec(char **tab, int taille); /* libération mémoire de chaque chaine */
    int is_present(char **tab, char *chaine, int taille); /* vérifier la présence de chaine dans tab */
    void write(FILE *f, char **tab, int taille);
     
    int main(void)
    {
        FILE *fic = open("test.txt", "r");
        int nb_line = count(fic);
        int t;
     
        char **res = create(nb_line);
     
        t = read(fic, res, nb_line);
     
        display(res, t);
     
        fic = open("test_cp.txt", "w");
        write(fic, res, t);
     
        freec(res, nb_line);
        free(res);
     
        return 0;
    }
     
    char **create(int n)
    {
        char **tab = NULL;
        int i;
     
        tab = malloc(sizeof(char *) * n);
        if (tab == NULL)
            exit(EXIT_FAILURE);
     
        for (i=0; i<n; i++)
        {
            tab[i] = malloc(MAX);
            if (tab[i] == NULL)
                exit(EXIT_FAILURE);
        }
     
     
        return tab;
    }
     
    FILE *open(char *name, char *mode)
    {
        FILE *file = fopen(name, mode);
        if (file == NULL)
        {
            perror("");
            exit(EXIT_FAILURE);
        }
     
        return file;
    }
     
    int count(FILE *f)
    {
        char *p = NULL;
        char line[MAX] = {0};
        int counter = 0;
     
        while ((p=fgets(line, MAX, f)) != NULL)
            counter += 1;
     
        fseek(f, 0, 0);
     
        return counter;
    }
     
    int read(FILE *f, char **tab, int lines)
    {
        char *p = NULL;
        char line[MAX];
        size_t n;
     
        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))
                {
                    n = strlen(line) + 1;
                    p = memcpy(tab[j], line, n);
                    if (p == NULL)
                    {
                        fprintf(stderr, "Error allocation");
                        exit(EXIT_FAILURE);
                    }
                    j += 1;
                }
            }
        }
     
        fclose(f);
     
        return j;
    }
     
    void display(char **tab, int taille)
    {
        int i;
        for (i=0; i<taille; i++)
            printf("%s\n", tab[i]);
    }
     
    void freec(char **tab, int taille)
    {
        int i;
        for (i=0; i<taille; i++)
            if(tab[i] != NULL)
                free(tab[i]);
    }
     
    int is_present(char **tab, char *chaine, int taille)
    {
        int i, n;
     
        if (taille == 0)
            return 0;
     
        for (i=0; i<taille; i++)
        {
            n = strcmp(tab[i], chaine);
            if (n == 0)
                return 1;
        }
     
        return 0;
    }
     
    void write(FILE *f, char **tab, int taille)
    {
        char *p = NULL;
        int i;
        size_t n;
     
        for (i=0; i<taille; i++)
        {
            p = strchr(tab[i], '\0');
            if (p != NULL)
                *p = '\n';
     
            n = strlen(tab[i]);
            fwrite(tab[i], 1, n, f);
        }
     
        fclose(f);
    }
    Maintenant j'ai d'autres erreurs avec valgrind, Cependant l'erreur du strdup semble résolue

    ==6769== Conditional jump or move depends on uninitialised value(s)
    ==6769== at 0x4028A57: strlen (mc_replace_strmem.c:390)
    ==6769== by 0x8048C97: write (fichier.c:162)
    ==6769== by 0x8048807: main (fichier.c:29)
    Merci pour ton aide en tout cas, si tu vois la solution à ce problème, merci par avance.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    @winjerome,

    Tu viens de résoudre la 2ème, bien joué...

    Tout est résolue, le code fonctionne sans erreur, ni du compilo, ni de valgrind.

    Merci à vous
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de valgrind sur OpenCV
    Par takout dans le forum OpenCV
    Réponses: 2
    Dernier message: 11/12/2012, 11h57
  2. Valgrind sort une erreur
    Par Narom dans le forum Débuter
    Réponses: 4
    Dernier message: 03/08/2011, 10h41
  3. realloc erreur avec valgrind
    Par lilington dans le forum Débuter
    Réponses: 6
    Dernier message: 12/05/2011, 03h46
  4. Valgrind erreur incomprise
    Par Anonymouse dans le forum Linux
    Réponses: 5
    Dernier message: 14/10/2008, 08h08
  5. Erreurs générées par valgrind
    Par awalter1 dans le forum Linux
    Réponses: 2
    Dernier message: 16/02/2007, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo