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 :

segmentation fault sur affectation de chaine de caractères


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1
    Par défaut segmentation fault sur affectation de chaine de caractères
    bonjour

    nous avons actuellement tous nos programmes dévelopés en C + SQL sur une plateforme UNIXWARE.
    nous envisageons le passage sur une plateforme LINUX

    nous sommes donc en train de tout transférer et recompiler sous linux pour vérifier que tout fonctionnera.

    au niveau compil, même si le compilateur laisse passer moins de choses, on s'en sort.
    par contre nous avons un gros souci sur des appels de fonctions (interne ou externes) qui manipulent des chaines de caractères dans le cas où on appelle ces fonctions en passant une valeur "en dur" entre double quotes. Si dans la fonction on vient modifier la chaine de caractère çà fait un segmentation fault.

    exemple
    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
    //CODE QUI FONCTIONNE
    main()
    {
       char wvar[501];
       strcpy(wvar,"JAIPLUSDEDIXCARACTERES");                   
       printf("\navant appel fonction_interne wvar=%s\n",wvar); 
       fonction_interne(wvar);                                  
       printf("\napres appel fonction_interne wvar=%s\n",wvar);
    }
     
    static fonction_interne(chaine)                      
    char chaine[501];                                    
    {                                                    
        char chaine2[501];                                   
        printf("\ndebut fonction interne\n");
        printf("\nchaine=%s",chaine);                        
        if (strlen(chaine)>10)                               
        {                                            
            strncpy(chaine2,chaine,10);chaine2[10]='\0'; 
            strcpy(chaine,chaine2);                      
         }                                            
        printf("\nchaine=%s",chaine);                        
    }
    //FIN CODE
    // A L'exécution :
    avant appel fonction_interne wvar=JAIPLUSDEDIXCARACTERES

    debut fonction interne

    chaine=JAIPLUSDEDIXCARACTERES
    chaine=JAIPLUSDED
    apres appel fonction_interne wvar=JAIPLUSDED
    PAR CONTRE SI J'APPELLE LA FONCTION EN FAISANT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction_interne("JAIPLUSDEDIXCARACTERES");
    j'ai à l'exécution :
    debut fonction interne
    Segmentation fault (core dumped)
    AU MOMENT de faire le printf dans la fonction interne çà plante.
    et si j'enlève le printf, çà va planter au moment du strcpy de chaine2 vers chaine

    quelqu'un a-t-il déjà rencontré ce problème ?

    ps : le code que j'ai donné ne veut pas dire grand chose, mais c'était pour simplifier l'explication de mon problème !

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pense à la balise [ code ]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    strncpy(chaine2,chaine,10);
    chaine2[10]='\0';
    strcpy(chaine,chaine2);
    tu es bien d'accord que ceci est équivalent à chaine[10]='\0';?

    Une segfault vient toujours d'une écriture dans une mémoire interdite.
    C'est à dire dans un pointeur qui n'a pas été initialisé ou hors d'un tableau.

    La valeur passée en argument de la fonction serait ma première cible.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    ...qui manipulent des chaines de caractères dans le cas où on appelle ces fonctions en passant une valeur "en dur" entre double quotes
    Ce type de chaines n'est pas modifiable. Il est inutile d'essayer de modifier un caractère quelconque d'une telle chaine : elle ne DOIT pas être modifiée (elle est placée dans une zone mémoire en lecture seule).
    Par conséquent, strcpy(chaine,chaine2); est interdit si chaine est une chaine littérale.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Tu sembles être sous un OS unixoïde, donc utiliser GCC.
    Compile avec le paramètre -Wwrite-strings en ligne de commande et tu comprendras la vraie nature des chaînes littérales.
    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.

Discussions similaires

  1. Segmentation fault sur script PHP
    Par zoullou dans le forum Langage
    Réponses: 1
    Dernier message: 03/04/2007, 09h32
  2. lecture sur fichier et chaine de caractères
    Par Aethis dans le forum Langage
    Réponses: 3
    Dernier message: 10/07/2006, 11h27
  3. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29
  4. Segmentation Fault sur un fclose
    Par Beush dans le forum C
    Réponses: 9
    Dernier message: 30/11/2005, 19h30
  5. Segmentation fault sur un gethostbyname ?
    Par Mitox dans le forum Réseau
    Réponses: 9
    Dernier message: 25/11/2005, 16h17

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