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
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 35
    Par défaut Erreur de segmentation
    Bonjour,

    Voilà mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x8f88340 (LWP 3494)] 0xb7e7470a in ?? () from /lib/i386-linux-gnu/libc.so.6
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct
    {
    	char * key;
    	char * value;
    } stringPair;
     
    int main(const int argc, const char * argv[])
    {
    char* list1;
    char *key1;
    stringPair * pPair1;
     
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    pPair1=malloc(sizeof(stringPair));/*malloc(strlen(key1)+strlen(list1));*/
    strcpy (pPair1->key,key1);
    	strcpy (pPair1->value,list1);
    fprintf(stdout, "%s and %s\n",pPair1->key, pPair1->value);
    free(pPair1);
    }
    Donc je ne comprends pas pourquoi.

    Merci.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pPair1=malloc(sizeof(stringPair));/*malloc(strlen(key1)+strlen(list1));*/
    strcpy (pPair1->key,key1);
    strcpy (pPair1->value,list1);
    En faisant ça, tu alloues de la place pour la structure, mais tu n'alloues pas de place pour les zones pointées par les champs de la structure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pPair1=malloc(sizeof(stringPair));/*malloc(strlen(key1)+strlen(list1));*/
     
    pPair1->key = malloc(200);
    pPair1->value = malloc(200);
     
    strcpy (pPair1->key,key1);
    strcpy (pPair1->value,list1);
    marche beaucoup mieux.

  3. #3
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut
    Pourquoi 200 ?

    @+
    Rémi

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'était une taille tout à fait arbitraire, pour simplement illustrer le fait qu'il faut allouer de la mémoire et ainsi avoir un espace réservé pour y copier les chaines. J'aurais dû le préciser .
    Dans la réalité, il faudrait donner une taille justifiée et libérer la mémoire après utilisation.


    Je relis le code et je me rend compte de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    Les affectations à "" ne servent à rien, puisqu'elles sont immédiatement écrasées.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je relis le code et je me rend compte de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    Les affectations à "" ne servent à rien, puisqu'elles sont immédiatement écrasées.
    Je pense que tu es fatigue : les chaines de caracteres ne se copient pas comme ca
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Euh.... Je sais que ça ne se copie pas comme ça !

    char *ptr = "developpez.com" crée un pointeur sur une chaine et comme la chaine est constante, cette chaine est dans la zone mémoire réservée aux constantes. Si a la suite, je fais ptr= "developpez.net", ptr pointe maintenant vers une nouvelle chaine constante, qui est à un autre endroit de la mémoire statique (à voir même si le compilateur n'est pas suffisamment malin pour ne garder que la seconde affectation dans le code cité à mon message précédent).

    Le code suivant est valide, non ? (en tout cas, ni MinGW ni Dr Memory ne me jettent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        char *ptr = "developpez.com";
        printf("%p : %s\n", ptr, ptr);
     
        ptr = "developpez.net";
        printf("%p : %s\n", ptr, ptr);
    }

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Oula, alors y'a pas mal de problemes. Mes commentaires dans le code. Pose des questions si tu ne comprends pas.

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct
    {
    	char * key;
    	char * value;
    } stringPair;
     
    int main(int argc, char * argv[]) /* pas de const dans le prototype de main */
    {
    char* list1;
    char *key1;
    stringPair * pPair1;
     
    /*********************
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    **********************/
    /* allocation de l'espace memoire pour key1 et list1 */
    list1 = key1 = pPair1 = NULL; /* initialisation a NULL pour la liberation en cas d'erreur */
     
    key1 = malloc (200); /* taille a definir */
    list1 = malloc (200); /* taille a definir */
    pPair1=malloc(sizeof(stringPair));
     
    /* verification */
    if (key1 == NULL  ||  list1 == NULL  ||  pPair1 == NULL)
    {
      fprintf (stderr, "Erreur d'allocation memoire\n");
      free (key1), key1 = NULL;
      free (list1), list1 = NULL;
      free (pPair1), pPair1 = NULL; 
     return EXIT_FAILURE;
    }
     
    /* la memoire est allouee. On peut ecrire dedans */
    sprintf (key1, "test");
    sprintf (list1, "bonjour");
     
    /* on alloue le contenu de la structure */
    pPair1->key = pPair1->value = NULL;
     
    pPair1->key = malloc (300);
    ppair1->value = malloc (300);
    if (pPair1->key == NULL  || pPair1->value == NULL)
    {
      fprintf (stderr, "Erreur d'allocation memoire\n");
      free (key1), key1 = NULL;
      free (list1), list1 = NULL;
      free (pPair1->key), pPair1->key = NULL; 
      free (pPair1->value), pPair1->value = NULL; 
      free (pPair1), pPair1 = NULL; 
      return EXIT_FAILURE;
    }
     
    /* on peut copier les donnees. Utiliser strncpy serait mieux */
    strcpy (pPair1->key, key1);
    strcpy (pPair1->value,list1);
     
    /* affichage */
    fprintf(stdout, "%s and %s\n",pPair1->key, pPair1->value);
     
    /* liberation memoire */
      free (key1), key1 = NULL;
      free (list1), list1 = NULL;
      free (pPair1->key), pPair1->key = NULL; 
      free (pPair1->value), pPair1->value = NULL; 
      free (pPair1), pPair1 = NULL; 
     
    /* fin */
      return EXIT_SUCCESS;
    }

    A changer dans ce code : utiliser snprintf, strncpy.

    Pourquoi utilises-tu de la memoire dynamique ? Pour l'exercice, ou bien il n'y a aucune raison, et tu pourrais utiliser de la memoire statique, ce qui serait beaucoup plus simple pour toi ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

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