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

Biblioth�ques, syst�mes et outils C Discussion :

Structures et segmentation fault


Sujet :

Biblioth�ques, syst�mes et outils C

  1. #1
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut Structures et segmentation fault
    Bonjour � tous,

    je suis encore assez nouveau avec les notions de structures et listes chain�es. Pour faire simple, j'essaye de donner � une variable les valeurs qui sont dans un tableau (de type int). Le tableau est dans une structure. J'obtiens un petit seg faul, donc j'ai essay� de debugger pour comprendre o� �tait ma faute, et il se trouve qu'elle est dans la boucle if de la fonction display. Je crois que �a viendrait d'un nom/type de structure mal utilis� de ma part. Merci d'avance pour votre aide !

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //structure
        typedef struct Avion_dec Element;
        struct Avion_dec
        {
            var v; // on appelle la struct Avion dans cette structure 
            int tab_dec[4];
            struct Avion_dec *tete;
            struct Avion_dec *suivant;
        };
    J'initialise mon tab_dec[4] dans une autre fonction d'initialisation. Voici ma fonction d'affichage :

    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
     
    void display ()
        {
            int i = 0, variable = 0, numero;
            struct Avion var;
            struct Avion_dec *avion_dec;
     
            initialisation(&avion_dec);
     
            for(i = 0; i <4; i++) 
            { 
                variable = avion_dec->tab_dec[i]; 
                printf("%d - ", variable);
            }
        }

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    Il n'y a rien de particulier dans ce code. La partie int�ressante c'est le code de initialisation(). Que fait cette fonction du pointeur de pointeur qu'elle re�oit?

  3. #3
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut
    Rien de particulier, je me contente juste d'initialiser chacune des variables, comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
        void initialisation (struct Avion_dec *Avion_dec) 
        {
            Avion_dec->tete = NULL;
            Avion_dec->suivant = NULL;
            int var_numero = 0;
            int tab_dec[4] = {2, 5, 1, 3}; //tableau qui contient les caract de caract_avions(2, 5, 1 et 3)
        }

  4. #4
    Membre �m�rite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par d�faut
    Bonjour,
    un bon r�flexe serait d'utiliser un debuger mais aussi et surtout un memory profiler qui te donnerait beaucoup plus d'informations sur le lieu et le genre de probl�mes que tu rencontres.
    ⇒ essaye valgrind si tu es sous linux par exemple.

  5. #5
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par d�faut
    D�sol�, c'est les vacances je vais faire bref.

    Mais tu d�finis 1 pointeur (ligne 6) non initialis� et tu passes son adresse/ son pointeur � la proc�dure initialisation.
    Donc soit tu ne piges pas les pointeurs, soit tu as �t� �tourdi

    je ne dis rien sur le nommage et les variables non utilis�es (tu t�tonnes s�rement )

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

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

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par d�faut
    Bonjour.

    Histoire d�ajouter quelques informations.
    Les variables int var_numero; et int tab_dec[4]; sont locales � la fonction initialisation ();. Elles n�existent plus � la sortie de cette derni�re.

  7. #7
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut
    Citation Envoy� par foetus Voir le message
    D�sol�, c'est les vacances je vais faire bref.

    Mais tu d�finis 1 pointeur (ligne 6) non initialis� et tu passes son adresse/ son pointeur � la proc�dure initialisation.
    Donc soit tu ne piges pas les pointeurs, soit tu as �t� �tourdi

    je ne dis rien sur le nommage et les variables non utilis�es (tu t�tonnes s�rement )
    Pour �tre honn�te, j'ai encore du mal avec l'utilisation des pointeurs, je pense avoir compris la partie th�orique, mais l'appliquer dans un programme c'est une autre histoire (en effet je t�tonne beaucoup...) Je vais essayer de voir ce qui cloche et de revoir quelques exemples/tutos sur internet.
    Par rapport aux variables non utilis�, j'avais commenc� � coder une condition (mais je l'ai enlev� car je l'avais de toute fa�on mis en commentaire dans mon code, je ne l'ai pas encore fini) et du coup j'ai oubli� de retirer les variables de cette partie

    Citation Envoy� par gerald3d Voir le message
    Bonjour.

    Histoire d�ajouter quelques informations.
    Les variables int var_numero; et int tab_dec[4]; sont locales � la fonction initialisation ();. Elles n�existent plus � la sortie de cette derni�re.
    Ha mince je pensais qu'en les initialisant et sachant qu'elles sont dans une structure �a prenait en compte les modifications apport�es.. Je vais changer �a de suite, merci � tous !

  8. #8
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut
    Citation Envoy� par WhiteCrow Voir le message
    Bonjour,
    un bon r�flexe serait d'utiliser un debuger mais aussi et surtout un memory profiler qui te donnerait beaucoup plus d'informations sur le lieu et le genre de probl�mes que tu rencontres.
    ⇒ essaye valgrind si tu es sous linux par exemple.
    Je vais me renseigner par rapport � �a (car je code sous windows) merci pour l'astuce

  9. #9
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Et il faudrait activer et lire les warnings de compilateur. Beaucoup des erreurs ici doivent t'�tre signal�es par des warnings.

  10. #10
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Et il faudrait activer et lire les warnings de compilateur. Beaucoup des erreurs ici doivent t'�tre signal�es par des warnings.
    Je les ai d�j� d'activ�s, mais je ne comprenais pas vraiment ce que je pouvais changer vu qu'il m'indique que ce sont des doubles pointeurs
    Nom : init.png
Affichages : 274
Taille : 30,7 Ko

  11. #11
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Tu passes un pointeur de pointeur � une fonction qui attend un pointeur, c'est donc une erreur signal�e. N'ayant pas la fonction et voyant que tu passais l'adresse d'un pointeur non initialis�, c'est pourquoi j'ai demand� la fonction qui aurait pu initialiser le pointeur avec de la m�moire dynamique.
    Note que si tu corriges en enlevant le &, tu t'approches d'une solution, mais le compilateur d'indiquera alors l'utilisation d'une variable non initialis�e qu'il faut corriger.

    Il y a des choses bizarres avec ton var qui est un type dans Avion_dec et est utilis� comme variable reli�e � rien dans main().

  12. #12
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Tu passes un pointeur de pointeur � une fonction qui attend un pointeur, c'est donc une erreur signal�e. N'ayant pas la fonction et voyant que tu passais l'adresse d'un pointeur non initialis�, c'est pourquoi j'ai demand� la fonction qui aurait pu initialiser le pointeur avec de la m�moire dynamique.
    Note que si tu corriges en enlevant le &, tu t'approches d'une solution, mais le compilateur d'indiquera alors l'utilisation d'une variable non initialis�e qu'il faut corriger.

    Il y a des choses bizarres avec ton var qui est un type dans Avion_dec et est utilis� comme variable reli�e � rien dans main().
    D'accord, merci pour les remarques je vais corriger et revoir mes variables

  13. #13
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par d�faut
    On passe 1 pointeur pour modifier 1 variable : donc tu n'as pas besoin de d�finir 1 pointeur, juste 1 variable de ta structure, et tu passes son adresse pour l'initialiser.
    1 double pointeur est utilis� pour initialiser la structure mais surtout allouer ("malloc"er) le pointeur.

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 841
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par d�faut
    Bonjour
    Citation Envoy� par megumi01 Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    struct Avion var
    struct Avion_dec *avion_dec;
     
    initialisation(&avion_dec);
    avion_dec �tant de type "struct Avion_dec �toile" (c'est bien d�clar� ainsi), &avion_dec est donc de type "struct Avion_dec �toile �toile" (principe simple, tout pointeur de type "truc" devient automatiquement et irr�vocablement "truc �toile", quel que soit ce qui est inclus dans le terme "truc").

    Reprends les bases d'une variable. Tu veux un int, tu �cris simplement int toto. Tu veux un float, tu �cris tout aussi simplement float tutu. Et dans tous les cas tu peux effectivement passer leur adresse � des fonctions de modification, exemple scanf("%d %f", &toto, &tutu).
    Tu peux aussi travailler � partir de pointeurs. C'est pas interdit. C'est idiot, mais c'est pas interdit. Exemple
    Code c : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    int *toto;
    toto=malloc(sizeof(int));
    if (toto == NULL) {
    	// Souci d'allocation, gérer le cas (et généralement ça se traduit par l'arrêt de la fonction sans oublier la libération de toutes les ressources éventuellement allouées en amont)
    	...
    }
    scanf("%d", toto)

    Donc soit tu passes par la notation "pointeur" et dans ce cas tu fais les choses compl�tement et correctement (tu lui alloues de la m�moire, tu testes le r�sultat de l'allocation) puis tu passes juste le pointeur � la fonction "initialisation()" ; soit tu utilises la notation "variable normale" et dans ce cas tu supprimes cette �toile idioteincompr�hensible � la d�claration. D'autant plus que tu l'as fait pour "var", je ne comprends pas pourquoi tu ne l'as pas fait de fa�on identique pour "avion_dec".

    Citation Envoy� par megumi01 Voir le message
    mais je ne comprenais pas vraiment ce que je pouvais changer vu qu'il m'indique que ce sont des doubles pointeur
    Effectivement, comme je l'ai dit, ayant d�clar� "avion_dec" comme �tant un pointeur, "&avion_dec" devient fatalement un double pointeur. Le compilateur ne pouvant pas pr�sumer que "avion_dec" avait �t� mal d�clar�, il te pr�vient que le param�tre de la fonction "initialisation()" n'est pas pr�vu pour recevoir un double pointeur.

    Citation Envoy� par megumi01 Voir le message
    Pour �tre honn�te, j'ai encore du mal avec l'utilisation des pointeurs, je pense avoir compris la partie th�orique, mais l'appliquer dans un programme c'est une autre histoire (en effet je t�tonne beaucoup...)
    https://www.developpez.net/forums/d2...sion-pointeurs
    Sinon une r�gle d'or et intransigible: d�s que tu as un pointeur, style int *pt ("int" ou tout autre type peu importe), tu n'as absolument pas le droit de modifier le point� "�toile pt" (donc �crire *pt=...) si tu n'as pas �crit quelque part au dessus "pt=adresse_valide". Le vocable "adrese_valide" peut �tre une adresse venue d'une autre variable existante (ex int toto; int *pt; pt=&toto => r�gle respect�e j'ai bien �crit "pt=adresse_valide" car "&toto" est bien une adresse existante) ou bien une adresse donn�e par malloc (malloc �tant une fonction destin�e � allouer de la m�moire en live depuis la m�moire disponible de ton ordi). Et si le pointeur est un param�tre de fonction alors la r�gle reste la m�me sauf qu'il faut la remonter � l'endroit o� on appelle la fonction.
    Tant que tu te forceras � respecter cette r�gle, tu n'auras aucun probl�me. Et si tu n'arrives pas � trouver quoi mettre dans "pt", c'est alors peut-�tre un signe que dans ce cas il ne fallait pas utiliser un pointeur.
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre r�gulier
    Homme Profil pro
    �tudiant
    Inscrit en
    D�cembre 2021
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2021
    Messages : 10
    Par d�faut
    Citation Envoy� par Sve@r Voir le message
    https://www.developpez.net/forums/d2...sion-pointeurs
    Sinon une r�gle d'or et intransigible: d�s que tu as un pointeur, style int *pt ("int" ou tout autre type peu importe), tu n'as absolument pas le droit de modifier le point� "�toile pt" (donc �crire *pt=...) si tu n'as pas �crit quelque part au dessus "pt=adresse_valide". Le vocable "adresse_valide" peut �tre une adresse venue d'une autre variable existante (ex int toto; int *pt; pt=&toto => r�gle respect�e j'ai bien �crit "pt=adresse_valide" car "&toto" est bien une adresse existante) ou bien une adresse donn�e par malloc (malloc �tant une fonction destin�e � allouer de la m�moire en live depuis la m�moire disponible de ton ordi). Et si le pointeur est un param�tre de fonction alors la r�gle reste la m�me sauf qu'il faut la remonter � l'endroit o� on appelle la fonction.
    Tant que tu te forceras � respecter cette r�gle, tu n'auras aucun probl�me. Et si tu n'arrives pas � trouver quoi mettre dans "pt", c'est alors peut-�tre un signe que dans ce cas il ne fallait pas utiliser un pointeur.
    Super merci beaucoup pour tes exemples (qui sont tr�s clairs), je vais de ce pas lire ce qui a �t� dit au lien que tu m'as envoy�

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Structures, pointeur et segmentation fault
    Par pierre_92 dans le forum Langage
    R�ponses: 3
    Dernier message: 14/12/2017, 16h01
  2. Segmentation fault sur destruction d'une structure
    Par User Name dans le forum D�buter
    R�ponses: 9
    Dernier message: 30/03/2011, 15h31
  3. R�ponses: 3
    Dernier message: 21/01/2008, 14h38
  4. R�ponses: 6
    Dernier message: 01/11/2007, 18h44
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    R�ponses: 15
    Dernier message: 08/08/2003, 13h43

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