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 de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Par défaut erreur de segmentation
    salut;
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(void){
    int i=0;
    char *str;
     
    gets(str);
    int k=strlen(str);
    //printf("%d\n",k);
    //printf("%s\n",str);
    while( i<=k-1){
     
    if(str[i]==str[k-i-1]){
       if(i==k-1)printf("ok\n");
       i++;}
     
       else {
       printf("nok\n");
       break;
         }
     
    }
     
    }
    résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ./a.out
    xnhdplf
    nok
    Erreur de segmentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    atttttta
    ok
    Erreur de segmentation
    ce code teste si une chaine est palindrome.comment eviter l'erreur de segm?

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Pas besoin d'aller plus loin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(void){
    int i=0;
    char *str;
     
    gets(str);
    ...
    }
    La mémoire n'a pas été allouée pour str.

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Outre le fait que tu n'as pas alloué de mémoire pour ta vaiable str, l'emploi de gets() est dans tous les cas déconseillé. Une bonne manière de faire est:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void fclean(char *s_tampon, FILE *pf);
     
    int main(void)
    {
        int i=0;
        /* Ici, on alloue la mémoire pour le tampon */
        char s_tampon[50] = "";
     
        /* saisie de la chaine de caractère à tester */
        fgets(s_tampon, sizeof s_tampon, stdin);
        fclean(s_tampon, stdin);
     
        /* code spécifique palindrome ... */
    }
    Pour la fonction fclean(), il suffit de faire une recherche sur le forum.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    En plus des reponses precedentes, j'ajouterais que tu peux te renseigner sur malloc pour allouer de la memoire.

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 41
    Par défaut
    Citation Envoyé par Elboras Voir le message
    En plus des reponses precedentes, j'ajouterais que tu peux te renseigner sur malloc pour allouer de la memoire.
    Dans quels cas il faut allouer la memoire? pourquoi ne pas utliser le stack?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Citation Envoyé par akrlot Voir le message
    Dans quels cas il faut allouer la memoire? pourquoi ne pas utliser le stack?
    Ca c'est un sujet pour lequel on pourrait discuter des heures, quel serait le mieu dans quel cas ?
    Basiquement, si tu demande une information a un utilisateur, quel taille va faire la variable qui doit recevoir le resultat ?

    par exemple je fais un programme qui demande a l'utilisateur un texte qu'il souhaiterais m'envoyer.
    je creer donc une variable "message", maintenant la question est : quel taille
    fera mon message ? je ne le sais pas encore.

    Pour pallier a mon probleme je peux faire un systeme simple (je ne dis pas dutout qu'il est tres obtimise), c'est de creer un buffer de 100
    char buffer[100], et des que j'atteind le plafond de mon buffer, je realou la taille de la memoire deja aloue a ma variable message (char *message
    pour rajouter ce buffer.

    si par exemple javais besoin de 587 octets pour stoquer mon message, mon buffer n'aurait pas suffit, j'aurais pu faire un buffer de 10 000 pour etre sur mais ce n'aurait pas ete tres malin. Donc avec un systeme plutot malin jai un buffer d'une taille fixe de 100 (ou d'une autre taille), et a la fin de l'ecriture de mon message ma variable message a alloue 587 octets.

    Ceci est un exemple simple explique tres schematiquement

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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