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 :

Problème de Core Dumped !


Sujet :

C

  1. #1
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut Problème de Core Dumped !
    Bonjour,

    j'ai un petit problème de Core Dumped (segmentation fault) qui m'énerve beaucoup !

    D'aprés mes tests (printf successifs), cela viendrait de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( j>0 && strcmp(t[j].nom,t[j-1].nom)<0)
    Si vous avez une idée, n'hésitez pas !

    Merci d'avance.




    PS: je vous laisse le code complet :
    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
    #include "stdio.h"
    #include "stdlib.h"
     
    #define MAX 250
     
    // Definition des structures
     
    typedef struct{
    char* nom;
    int n;        
    }structure;
     
    // Methode
     
    void tri_insertion(structure t[], int n)
    {
         int i,j;
         structure tmp;
     
         for(i=1;i<n;i++)
         {
                j=i;
                while( j>0 && strcmp(t[j].nom,t[j-1].nom)<0)
                {
                 // Permuter         
                 tmp=t[j];
                 t[j]=t[j-1];
                 t[j-1]=tmp;
     
                 j=j-1;
                }
         }
     
     
    }
     
    // Main()
     
    int main()
    {
        structure tab_conf[MAX];
        int nb_conf=0;
        int i=0;
     
        structure* nouveau = malloc(sizeof(structure));
     
        while(i<8)
        {
        scanf("%s",&nouveau->nom);
        tab_conf[nb_conf]=*nouveau;
        nb_conf++;
        tri_insertion(tab_conf,nb_conf);
        i++;
        }
     
        for(i=0;i<nb_conf;i++)
         printf("%s",tab_conf[i].nom);
     
        return 0;   
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ton champs nom n'est pas alloué dynamiquement, la valeur n'étant pas initialisé, le comportement est indéfini -> core dumped...

    Il faudrait mettre un malloc...

    Jc

  3. #3
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    A première vue, tu teste si j est suppérieur à 0 et est ce que tu teste s'il ne déborde pas du tableau (je n'ai pas encore regardé le code mais ça peut être une piste)

  4. #4
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par PRomu@ld
    A première vue, tu teste si j est suppérieur à 0 et est ce que tu teste s'il ne déborde pas du tableau (je n'ai pas encore regardé le code mais ça peut être une piste)
    La boucle est décroissante donc, il n'y a pas de problème.

    Citation Envoyé par fearyourself
    Ton champs nom n'est pas alloué dynamiquement, la valeur n'étant pas initialisé, le comportement est indéfini -> core dumped...

    Il faudrait mettre un malloc...

    Jc
    Effectivement, le segmentation fault doit venir de la, je vais y réfléchir !

    Merci pour votre rapidité !

  5. #5
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    J'ai modifié ma structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct{
    char nom[255];
    int n;       
    }structure;
    Pas de problème de malloc ...
    Ca fonctionne trés bien !

    Merci !

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Retire l'étoile... Là, tu as 255 pointeurs...

  7. #7
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut
    Oui bien sur !
    C'est une erreur de copier-coller, j'avais juste ajouté le [255] !

    Je modifie ça tout de suite

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Problème de Core Dumped !
    Citation Envoyé par KneXtasY
    j'ai un petit problème de Core Dumped (segmentation fault)
    Tu as de la chance que ton système surveille ton code...
    PS: je vous laisse le code complet :
    Code partiellement commenté et corrigé.
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    /* -ed-
    #include "stdio.h"
    #include "stdlib.h"
     
    pour les entetes standards, c'est pas " " mais < >
    */
    #include <stdio.h>
    #include <stdlib.h>
     
    /* -ed-
    ajoute pour strcmp(). 
    Apprendre a mieux regler son compilateur peut sauver des vies...  
    */
    #include <string.h>
     
    #define MAX 250
     
    // Definition des structures
     
    typedef struct{
       char* nom;
       /* -ed- attention, pointeur non initialise... */
       int n;
    }
    structure;
     
    // Methode
     
    /* -ed- fonction non exportee : ajoute 'static' */
    static void tri_insertion(structure t[], int n)
    {
       int i, j;
       structure tmp;
     
       for (i = 1;i < n;i++)
       {
          j = i;
          while ( j > 0 && strcmp(t[j].nom, t[j - 1].nom) < 0)
          {
             // Permuter
             tmp = t[j];
             t[j] = t[j - 1];
             t[j - 1] = tmp;
     
             j = j - 1;
          }
       }
     
     
    }
     
    // Main()
     
    int main()
    {
       structure tab_conf[MAX];
       int nb_conf = 0;
       int i = 0;
     
       structure* nouveau = malloc(sizeof(structure));
       /* -ed- 
          malloc() peut echouer. De plus, la valeur de nouveau->nom 
          est toujours indeterminee... 
          
          Pourquoi une allocation dynamique de la structure ?
        */
     
       if (nouveau != NULL)
       {
          while (i < 8)
          {
     
             /* -ed-
                 scanf("%s",&nouveau->nom);
                 
                 Comportement indéfini : 
                 "%s" attend l'adresse du premier element d'un tableau de char. 
                 Pas l'adresse d'un pointeur sur char 
                 (non initialise, de surcroit). 
                 
                 D'autre part, comme souvent, scanf() est ici mal utilise. 
                 - Pas de limitation de la taille saisie
                 - Pas de test de la valeur retournee
                 - Pas de possibilité de saisir un espace...
                 
                 scanf() n'est pas une fonciotn de debutant, ni meme de 
                 confirme...
                 
                 Alternatives :
                 
                 <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
                 <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
                 
                 */
             scanf("%s", nouveau->nom);
     
             tab_conf[nb_conf] = *nouveau;
             /* -ed- 
             attention, en admettant que la zone pointee par 
             nouveau->nom soit valide, le pointeur serait recopie, mais pas la 
             zone pointee... 
             
             Je ne sais bien ce que tu cherches a faire mais c'est louche...
             */
     
             nb_conf++;
     
             tri_insertion(tab_conf, nb_conf);
             /* -ed- ca fout la trouille... */
     
             i++;
             /* -ed- varie comme 'nb_conf'. Est-ce bien utile ? */
          }
     
          for (i = 0;i < nb_conf;i++)
             printf("%s", tab_conf[i].nom);
             /* -ed- 
             Sortie incertaine. Il manque un '\n' ou un fflush(stdout)
             
             Evidemment, dans une structure de code, il est toujours preferable 
             d'ajouter les { }...
             
             */
     
          /* -ed- memoire non liberee... Ajoute : */
          free (nouveau), nouveau = NULL;
       }
     
       return 0;
    }

  9. #9
    Membre régulier Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Points : 109
    Points
    109
    Par défaut Re: Problème de Core Dumped !
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par KneXtasY
    j'ai un petit problème de Core Dumped (segmentation fault)
    Tu as de la chance que ton système surveille ton code...
    Oui, je travaille sous Cygwin (Bon ok c'est pas un système ).

    Citation Envoyé par Emmanuel Delahaye
    Code partiellement commenté et corrigé.
    Merci beaucoup !

    C'est vrai qu'il y avait pas mal de trucs louches ...
    Bon le main() avait juste pour but de tester le tout mais n'a aucun interet !

    Merci.

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

Discussions similaires

  1. Problème de Core dumped, Memory Fault
    Par pmboutteau dans le forum C
    Réponses: 26
    Dernier message: 26/03/2009, 16h07
  2. Problème de core dump dans un malloc
    Par zooro dans le forum C
    Réponses: 8
    Dernier message: 19/07/2007, 20h47
  3. Comment générer un core dump en c
    Par gege2061 dans le forum Linux
    Réponses: 3
    Dernier message: 12/11/2006, 15h33
  4. Segmentation fault (core dumped)
    Par Battosaiii dans le forum C
    Réponses: 13
    Dernier message: 25/11/2005, 18h36
  5. problème transfert de dump
    Par gerald2545 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 16/06/2004, 10h42

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