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 :

strcpy segmentation fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 30
    Par défaut strcpy segmentation fault
    Bonjour a tous.

    j ai cherche pas mal dans le forum et en bidouillant mais ca marche toujours pas. question trop facile sans doute

    Partout, on a l air de dire que si on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char * toto = "toto";
    char * tutu = "tutu";
    strcpy(toto,tutu)  // on copie tutu dans toto
    printf(" toto est %s ", toto);
    ca me donne une segmentation fault.
    j ai cherche partout dans la signature de la fonction, ca devrait marche.

    Si vous pouviez m aider

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Compile sous gcc avec le flag -Wwrite-strings, et il considèrera les chaînes littérales comme ce qu'elles sont vraiment : En lecture seule.

    Dommage, je n'ai trouvé aucun équivalent sous Visual et pourtant j'ai cherché...
    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
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Bon, pour développer: Dans la plupart des implémentations modernes, les chaînes littérales (ou "constantes chaînes") sont placées dans une zone mémoire en lecture seule.
    Et pourtant, le standard C semble exiger qu'on ait un accès non-const aux chaînes littérales.
    Le conflit de ces deux facteurs donne un bug, un comportement indéfini si l'on tente d'écrire sur une chaîne littérale. Sous Linux ou Windows, typiquement, ça crashe (segfault ou AccessViolation).
    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.

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Par défaut
    essai de faire
    strncpy(toto,tutu,4);

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par ryadh.naouar
    essai de faire
    strncpy(toto,tutu,4);
    Aucune différence.
    plus proprement, esssai ceci

    #define MAX_CHAR 5

    char toto[MAX_CHAR]="toto";
    char tutu[MAX_CHAR]="tutu";
    strncpy(toto,tutu,MAX_CHAR);
    toto[MAX_CHAR]='\0';
    printf....
    Plus simple, tant que les chaînes ont la même longueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char[] toto = "toto";
    const char * tutu = "tutu";
    strcpy(toto,tutu)  // on copie tutu dans toto
    printf(" toto est %s ", toto);
    (Saleté de IE qui pige pas ce que c'est qu'un espace insécable...)
    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.

  6. #6
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 30
    Par défaut
    Ok, merci pour ton aide !!!
    Je vais regarder ce que ca donne !!

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Par défaut
    plus proprement, esssai ceci

    #define MAX_CHAR 5

    char toto[MAX_CHAR]="toto";
    char tutu[MAX_CHAR]="tutu";
    strncpy(toto,tutu,MAX_CHAR);
    toto[MAX_CHAR]='\0';
    printf....

  8. #8
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 30
    Par défaut
    ah bah oui la ca marche, en utilisant les array plutot que les *.

    j ai essaye le flag mais par contre ca ca a pas marche.

    Bon je vais mettre des valeurs max alors.
    Merci de votre aide.

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

Discussions similaires

  1. Segmentation fault avec strcpy()
    Par tasna dans le forum C++
    Réponses: 13
    Dernier message: 26/04/2012, 01h05
  2. segmentation fault lors de l'utilisation de strcpy
    Par simplyc dans le forum Débuter
    Réponses: 18
    Dernier message: 17/01/2011, 19h52
  3. Strcpy et segmentation fault...
    Par laurent_ifips dans le forum C
    Réponses: 15
    Dernier message: 11/12/2005, 11h23
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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