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 :

problème sur strdup


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Webplanneur
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut problème sur strdup
    bonjour les developpez, aujourd'hui je decide de recoder la fonction strdup, mais j'ai un petit soucis, lorsque je compile avec une chaine vide, la fonction me renvoie bien NULL, mais lorsque que je lui passe une string ... segfault, je ne comprend pas d'où vient mon problème :/
    voici mon code :
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char    *fct_strdup(char *src)
    {
        char    *dest;
        int     i;
        int     LEN;
     
        i = 0;
        if (src == NULL)
            return (NULL);
        while (src[LEN] != '\0')
        {
            LEN++;                                  /* ma fct strlen pour LEN */
        }
        LEN = LEN + 1;
        dest = (char*)malloc(sizeof(*dest) * LEN);  /* appel malloc */
        while (src[i] != '\0')
        {
            dest[i] = src[i];
            i++;                                    /* ma fct strcpy */
        }
        dest[i] = '\0';
        free(dest);
        return(dest);
    }
     
    int main()
    {
        char    *src;
     
        src = "";                                    /* mon problème ... */
        printf("string before strdup : %s\n\n", *src);
        *fct_strdup(*src);
        printf("string after strdup : %s\n", *src);
        return (0);
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    LEN n'est pas initialisé, et tu commets l'erreur de libérer la chaîne que tu t'apprêtes à retourner.

    Au passage, src devrait être déclaré const, vu que la fonction ne modifie pas la chaîne de départ. Et caster le retour de malloc() est inutile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Homme Profil pro
    Webplanneur
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut
    Merci a toi je m'en vais de ce passer essayer tout ceci =)

    ...

    J'ai donc initialiser mon LEN, enlever mon cast et essayer d'enlever mon free ou de le mettre apres le return, toujours le meme problème, des que je passe une chaine a src dans mon main, je segfault ..

  4. #4
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par SleliLu Voir le message
    Merci a toi je m'en vais de ce passer essayer tout ceci =)

    ...

    J'ai donc initialiser mon LEN, enlever mon cast et essayer d'enlever mon free ou de le mettre apres le return, toujours le meme problème, des que je passe une chaine a src dans mon main, je segfault ..
    Le probleme ne vient plus de ta fonction, mais de comment tu l'appelle. Tu ne passes pas src correctement a fct_strdup. Passe le pointeur et non la valeur.
    Enleve egalement le dereferencement (*) devant fct_strdup dans le main.

    En gros, en plus des modifications de medinoc, ceci devrait marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main()
    {
        char    *src, *dst;
     
        src = "abcd";                                    
        dst = fct_strdup(src);
        printf("string after strdup : %s\n", dst);
        free(dst);
        return (0);
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    Webplanneur
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut
    C'est parfait, merci mille fois, comme quoi j'ai bien fais de poster sur le forum, je comprend mieux mes erreurs =) !
    si jamais mon code peut intéresser quelqu'un, le voici :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char    *fct_strdup(char *src)
    {
        char    *dest;
        int     i;
        int     LEN;
     
        i = 0;
        LEN = 0;
        if (src == NULL)
            return (NULL);
        while (src[LEN] != '\0')
        {
            LEN++;                                  /* ma fct strlen pour LEN */
        }
        LEN = LEN + 1;
        dest = malloc(sizeof(*dest) * LEN);         /* appel malloc */
        while (src[i] != '\0')
        {
            dest[i] = src[i];
            i++;                                    /* ma fct strcpy */
        }
        dest[i] = '\0';
        return(dest);
    }
     
    int main()
    {
        char    *src;
        char    *dest;
     
        src = "trololo.net";
        dest = fct_strdup(src);
        printf("string after strdup : %s\n", dest);
        free(dest);
        return (0);
    }

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Pourquoi refaire une boucle pour la copie de la chaîne alors que tu inclus le header string.h ? Pareil pour le calcul de la taille de la chaîne passée en argument !

    Personnellement, je n'aime pas le nom des variables en majuscule comme LEN car on pourrait croire à tord que tu utilises une constante.

    Ta fonction pourrais se résumer à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char * fct_strdup (const char * src)
    {
        char * dest = NULL;
     
        if (src)
        {
           dest = malloc (strlen (src) + 1);
           if (dest)
             strcpy (dest, src);
        }
     
        return dest;
    }
    Et inutile de mettre des commentaires genre
    On le vois donc ce n'est pas la peine et ça pollue le code !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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