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 segmentation fault avec mes structures


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut problème de segmentation fault avec mes structures
    Bonjour,

    J'avais à réaliser un projet en c et je suis resté bloqué sur un problème auquel personne ne m'a répondu. Ayant déjà rendu le projet je me permet de poser la question ici.

    j'avais trois structures :
    la struture pain qui contenait la structure pile et la structure sortie qui contenait elle meme la structure number.
    Mon problème apparaissait à l'initialisation.

    voici mes structures détaillé :

    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
    typedef struct s_number
    {
      int	digit;
      struct s_number *next;
      struct s_number *prev;
    }	t_number;
     
    typedef struct s_nbr_stack
    {
      struct s_number *number;
      struct s_nbr_stack *next;
      struct s_nbr_stack *prev;
    }	t_nbr_stack;
     
    typedef struct s_op_stack
    {
      int	operator;
      struct s_op_stack *next;
      struct s_op_stack *prev;
    }	t_op_stack;
     
    typedef struct s_pain
    {
      t_nbr_stack	*sortie;
      t_number	*number;
      t_op_stack	*pile;
    }	t_pain;
    et voici le début de mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     t_pain	*pain;
     
      pain = malloc(sizeof(t_pain));
      pain->sortie = malloc(sizeof(t_nbr_stack));
      pain->sortie->number = malloc(sizeof(t_number));
      pain->pile = malloc(sizeof(t_op_stack));
      pain->pile = NULL;
      pain->sortie->number = NULL;
      pain->sortie = NULL;
      pain = NULL;
    premièrement il me faisait toujours un segfault si j'essayait d'initialiser un élément supérieur avant un élément inférieur (ex : pain avant pain->sortie). Je ne comprend pas pourquoi.
    deuxièmement avec le code ci dessus pas moyen de lui parler d'autre chose que de pain (ex : if(pain->sortie == NULL)) me donne un segfault mais pas avec if(pain == NULL) ce qui ne m'arrange pas du tout.
    Quoiqu'il en soit je pense que mon deuxième problème vient du premier.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Es-tu sûr que toutes ces structures ont besoin de chaînage ?
    Et que les noms sont appropriés au chaînage ? Je déconseille d'utiliser directement un pointeur vers chaînon pour une liste: On s'emmèle beaucoup moins les pinceaux si on a une structure de chaînon et une structure de liste qui contient le ou les pointeurs...

    De plus, je rappelle qu'un malloc() n'initialise rien, donc attention pour les tests. La première chose à faire en allouant une structure serait d'initialiser tous ses pointeurs à NULL.
    Code C : 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
    t_number * AllocNumber(void)
    {
    	static const t_number empty = {0, NULL, NULL};
    	t_number * pRet = malloc(sizeof *pRet);
    	if(pRet != NULL)
    		*pRet = empty;
    	return pRet;
    }
     
    t_nbr_stack * AllocNumberStack(void)
    {
    	static const t_nbr_stack empty = {NULL, NULL, NULL};
    	t_nbr_stack * pRet = malloc(sizeof *pRet);
    	if(pRet != NULL)
    		*pRet = empty;
    	return pRet;
    }
     
    t_op_stack * AllocOperatorStack(void)
    {
    	static const t_op_stack empty = {0, NULL, NULL};
    	t_op_stack * pRet = malloc(sizeof *pRet);
    	if(pRet != NULL)
    		*pRet = empty;
    	return pRet;
    }
     
    t_pain * AllocPain(void)
    {
    	static const t_pain empty = {NULL, NULL, NULL};
    	t_pain * pRet = malloc(sizeof *pRet);
    	if(pRet != NULL)
    		*pRet = empty;
    	return pRet;
    }
    Si tout est systématiquement initialisé lors de l'allocation, tes tests ==NULL marcheront.
    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.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    De plus, je rappelle qu'un malloc() n'initialise rien, donc attention pour les tests. La première chose à faire en allouant une structure serait d'initialiser tous ses pointeurs à NULL.
    D'où pour moi l'utilisation systématique de calloc , qui lui initialise tout à '0' (et sans rentrer dans le débat NULL peut être différent de '0' )
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    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
    Citation Envoyé par souviron34 Voir le message
    (et sans rentrer dans le débat NULL peut être différent de '0' )
    n1124 :

    6.3.2.3 Pointers
    ...
    3 An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
    ...
    55) The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant; see 7.17.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    D'où pour moi l'utilisation systématique de calloc , qui lui initialise tout à '0' (et sans rentrer dans le débat NULL peut être différent de '0' )
    Ben si, on y rentre: calloc() n'initialise pas à zéro, mais à all-bits-to-zero. Ce qui n'est pas forcément la façon de coder le zéro d'un pointeur ou d'un nombre en virgule flottante (même si dans les faits, sur un x86, c'est le cas)...
    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.

  6. #6
    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
    Citation Envoyé par souviron34 Voir le message
    D'où pour moi l'utilisation systématique de calloc , qui lui initialise tout à '0' (et sans rentrer dans le débat NULL peut être différent de '0' )
    Je suppose que tu parles de 0 (la valeur) et non du caractère '0'...

    Dans ce cas, tu veux sans doute dire

    "qui lui initialise tout à all-bit-to-zero"
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je suppose que tu parles de 0 (la valeur) et non du caractère '0'...

    Dans ce cas, tu veux sans doute dire

    "qui lui initialise tout à all-bit-to-zero"
    oui

    Citation Envoyé par Médinoc Voir le message
    Ben si, on y rentre: calloc() n'initialise pas à zéro, mais à all-bits-to-zero. Ce qui n'est pas forcément la façon de coder le zéro d'un pointeur ou d'un nombre en virgule flottante (même si dans les faits, sur un x86, c'est le cas)...
    C'est aussi le cas sur les Linux sur lesquels j'ai travaille (Redhat 6.0 a 9), ainsi que sur les HPUX (10...) , Irix, ..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/08/2008, 13h30
  2. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 01h12
  3. Réponses: 2
    Dernier message: 10/04/2006, 19h40
  4. Segmentation fault avec glCompressedTexImage2DARB
    Par patbier dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/12/2005, 10h32
  5. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17

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