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 :

erreurs de compilation + segmentation fault


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 16
    Points
    16
    Par défaut erreurs de compilation + segmentation fault
    Je ne comprends pas mes erreurs dans le début de programme suivant :
    Merci d'avance !


    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define TAILLE_MAX 20
    typedef struct abonne_ Abonne;
     
    /*L'entreprise Prog3com désire créer son propre réseau téléphonique. Celui-ci est composé d'abonnés,
    identifiés par leur nom, prénom et numéro d'appel (à 10 chiffres).*/
     
    struct abonne_{
            char* nom;
            char* prenom;
            int num;
    };
     
    typedef Abonne** reseau;
     
    /*déclarations de fonctions*/
    Abonne* creeAbonne(void);
    void detruit(Abonne** a);
     
    /*creeAbonne qui crée un nouvel abonné. Les différents champs seront ici introduits via le
    clavier.*/
    Abonne* creeAbonne(void){
            Abonne* a = malloc(sizeof(Abonne));
            if(a != NULL){
                    int num;
                    char* nom = calloc(TAILLE_MAX+1,sizeof(char));
                    char* prenom = calloc(TAILLE_MAX+1,sizeof(char));
                    do {
                    printf("Rentrez son nom \n");
                    scanf("%s",&(*nom));
                    }while(strlen(nom) > TAILLE_MAX+1);
                    do {
                    printf("Rentrez son prénom \n");
                    scanf("%s",&(*prenom));
                    }while(strlen(prenom) > TAILLE_MAX+1);
                    printf("Rentrez son numero \n");
                    scanf("%d",&num);
                    strncpy(a->nom,nom,strlen(nom)+1);
                    strncpy(a->prenom,prenom,strlen(prenom)+1);
                    a->num = num;
                    free(nom);
                    free(prenom);
            }
    }
    /*désallocations*/
    void detruit(Abonne** a){
            if((a == NULL) || (*a == NULL)){
                    fprintf(stderr, "Null pointer : Problème de destruction");
            }
            else {
                    free(&(*a)->nom);
                    free(&(*a)->prenom);
                    free(&(*a)->num);
                    free(*a);
                    *a=NULL;
            }
    }
     
    int main(void){
            Abonne* a = creeAbonne();
            detruit(&a);
    }

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    il te manque des ; à la fin des do/while (en regardant en diagonale la syntaxe ...) dans lesquels les comparaisons sont faites entre des char* et des int ...

    Tu as essayé de compiler et de comprendre les messages émis ?

    EDIT: Tu as modifié ton code ? Ma remarque ne tient plus, sauf en ce qui concerne les messages du compilo ...

  3. #3
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Dans la dernière version ... tu n'alloues pas la mémoire pour le champs nom (entre autre) dans ta structure Abonne dans la fonction creeAbonne, ça plante quand tu essayes de faire un strncpy.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Oui je l'ai modifié j'ai compris les messages d'erreurs de compilation
    Mais j'ai un problème de segmentation fault

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Voici comment j'ai modifié mon code. Je n'ai plus de segmentation fault mais plein de valeurs bizarres qui s'affichent dans le terminal

    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
    Abonne* creeAbonne(void){
            Abonne* a = malloc(sizeof(Abonne));
            /*Allocations : */
            a->nom = calloc(TAILLE_MAX+1,sizeof(char));
            a->prenom = calloc(TAILLE_MAX+1,sizeof(char));
     
            if((a != NULL) && (a->nom != NULL) && (a->prenom != NULL)){
                    int num=0;
                    char* nom = calloc(TAILLE_MAX+1,sizeof(char));
                    char* prenom = calloc(TAILLE_MAX+1,sizeof(char));
                    do {
                    printf("Rentrez son nom \n");
                    scanf("%s",&(*nom));
                    }while(strlen(nom) > TAILLE_MAX+1);
                    do {
                    printf("Rentrez son prénom \n");
                    scanf("%s",&(*prenom));
                    }while(strlen(prenom) > TAILLE_MAX+1);
                    printf("Rentrez son numero \n");
                    scanf("%d",&num);
                    strncpy(a->nom,nom,strlen(nom)+1);
                    a->nom[strlen(nom)]='\0';
                    strncpy(a->prenom,prenom,strlen(prenom)+1);
                    a->prenom[strlen(prenom)]='\0';
                    a->num = num;
                    free(nom);
                    free(prenom);
            }

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Montre-nous les erreurs affichés par ton compilateur. Ca nous permettra de regarder plus facilement le bout de code incriminé.

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Tu renvois quoi exactement comme valeur dans la fonction creeAbonne ?

    EDIT: des options utiles lors de la compilation (si tu utilises gcc) -Wall -Wextra
    un outil utile pour débugger : le debugger

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((a != NULL) && (a->nom != NULL) && (a->prenom != NULL))
    C'est un peu tard pour tester si a != NULL : si a == NULL, alors le programme plante sur les lignes qui précèdent

    syntaxe inutilement compliquée : &*nom est équivalent à nom (et ce même si nom est NULL)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strlen(nom) > TAILLE_MAX+1);
    Précaution illusoire :si le nom dépasse TAILLE_MAX caractères, alors on a déjà écrit en dehors du buffer et le programme est mort.
    Jouer plutôt sur le format de lecture pour limiter le nombre de caractères lus à TAILLE_MAX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strncpy(a->nom,nom,strlen(nom)+1);
    a->nom[strlen(nom)]='\0';
    Il est plus simple alors de faire strcpy(a->nom,nom)

    Logiquement, on connait la taille du nom et du prénom APRES la lecture, et on devrait allouer a->nom et a->prenom juste à la taille qui faut et pas plus à ce moment là, sur le modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a->nom = malloc(strlen(nom)+1);
    strcpy(a->nom, nom);
    Si TAILLE_MAX est d'une valeur raisonnable, pourquoi allouer nom et prenom dynamiquement plutôt que de déclarer des tableaux automatiques ?

    plein de valeurs bizarres qui s'affichent dans le terminal
    Mais on ne voit pas le code qui fait cet affichage, alors que dire ?

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    voici les valeurs bizarres :


    *** glibc detected *** ./abonnes: double free or corruption (out): 0x0000000001ff7020 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7f79d6999a8f]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x73)[0x7f79d699d8e3]
    ./abonnes[0x400946]
    ./abonnes[0x4009b9]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff)[0x7f79d693feff]
    ./abonnes[0x400699]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:01 401081 /home/gabriellebuytaert/abonnes
    00600000-00601000 r--p 00000000 08:01 401081 /home/gabriellebuytaert/abonnes
    00601000-00602000 rw-p 00001000 08:01 401081 /home/gabriellebuytaert/abonnes
    01ff7000-02018000 rw-p 00000000 00:00 0 [heap]
    7f79d0000000-7f79d0021000 rw-p 00000000 00:00 0
    7f79d0021000-7f79d4000000 ---p 00000000 00:00 0
    7f79d670b000-7f79d6720000 r-xp 00000000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f79d6720000-7f79d691f000 ---p 00015000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f79d691f000-7f79d6920000 r--p 00014000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f79d6920000-7f79d6921000 rw-p 00015000 08:01 266325 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f79d6921000-7f79d6aab000 r-xp 00000000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7f79d6aab000-7f79d6caa000 ---p 0018a000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7f79d6caa000-7f79d6cae000 r--p 00189000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7f79d6cae000-7f79d6caf000 rw-p 0018d000 08:01 266297 /lib/x86_64-linux-gnu/libc-2.13.so
    7f79d6caf000-7f79d6cb5000 rw-p 00000000 00:00 0
    7f79d6cb5000-7f79d6cd6000 r-xp 00000000 08:01 266284 /lib/x86_64-linux-gnu/ld-2.13.so
    7f79d6ec2000-7f79d6ec5000 rw-p 00000000 00:00 0
    7f79d6ed1000-7f79d6ed5000 rw-p 00000000 00:00 0
    7f79d6ed5000-7f79d6ed6000 r--p 00020000 08:01 266284 /lib/x86_64-linux-gnu/ld-2.13.so
    7f79d6ed6000-7f79d6ed8000 rw-p 00021000 08:01 266284 /lib/x86_64-linux-gnu/ld-2.13.so
    7fffc2737000-7fffc2758000 rw-p 00000000 00:00 0 [stack]
    7fffc27ff000-7fffc2800000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    Aborted

  10. #10
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Lis les remarques ... en plus de celles de Diogène, peux-tu me dire quelle valeur revoie ta fonction creeAbonne ? Non, car il manque un return !

    La valeur renvoyée comme tu ne la précises pas est non intitalisée -> tu tapes n'importe où en mémoire -> erreur.

  11. #11
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    La première ligne est la plus parlante :
    *** glibc detected *** ./abonnes: double free or corruption (out): 0x0000000001ff7020 ***
    Tu essayes de libérer un bloc mémoire non alloué.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Ouiii ! J'ai trouvé mon "free" douteux ! Merci !

    @ kwariz : j'ai effectivement fait une erreur bête en oubliant un return, merci pour ta remarque !^^

Discussions similaires

  1. une erreur du type Segmentation fault
    Par bae84 dans le forum Débuter
    Réponses: 8
    Dernier message: 16/12/2011, 16h34
  2. Réponses: 2
    Dernier message: 31/12/2009, 12h02
  3. Problème de compilation segmentation fault
    Par nightfire dans le forum Fortran
    Réponses: 7
    Dernier message: 24/02/2009, 17h02
  4. [erreur] Segmentation fault
    Par fveysseire dans le forum C
    Réponses: 11
    Dernier message: 15/06/2006, 14h44
  5. [ERREUR D'EXECUTION] Segmentation Fault
    Par CestPasMoi dans le forum C++
    Réponses: 3
    Dernier message: 26/11/2005, 17h38

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