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 :

Violation d 'accés, pointeur & structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 61
    Par défaut Violation d 'accés, pointeur & structure
    Bonjour à tous,
    Je rencontre un petit problème, la compilation est ok, mais à l'éxecution la console se fige quelques instants et se ferme... Avec un petit debugger ( sur devc++), j'obtient un jolie "Une violation d 'accés (erreur de segmentation)".

    En gros :

    Le programme plante a chaque fois que je créer un pointeur vers une variable de structure Sommet ET que j'essai d'accéder à un de ses champs
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //se situe dans le main
    	Sommet * S;
    	S->nbArcs = 0; //<== ca plante !

    Par contre, si je créer une variable locale S, ca marche.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sommet S;
    	S.nbArcs = 0; //<== ca marche.

    Je donne le main ainsi que la structure ( il y a d'autre fichier mai je ne pense qu'ils agissent sur le problème) :

    Le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
    #include "dicoParser.h"
    #include "structures.h"
     
     
    int main()
    {
      Sommet  *S;
      S->nbArcs = 3;
      S = fileParser(".\\dico.txt");
      system("PAUSE");	
      return 0;
    }
    Le fichier strcutres.h
    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
    #ifndef STRUCTURES_H
    #define STRUCTURES_H
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct sommet
    {
        char lettre;
        struct sommet ** arcs; //tableau de pointeur de sommets
        int nbArcs;
        char * motType; //"Nom", "Adj", "Ver"
        char * motBase; //forme de base du mot
    }Sommet;
     
    Sommet * nouvSommet();
    void addArc(Sommet * s);
     
    #endif // end ifndef STRUCTURES_H
    Le fichier strucutres.c
    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
    #include "structures.h"
     
    Sommet * nouvSommet()
    {
        Sommet * S;
        S->lettre = (char)NULL;
        S->arcs = NULL; //tableau de pointeur de sommets
        S->nbArcs = 0;
        S->motType = NULL;
        S->motBase = NULL;
        return S;
    }
     
    void addArc(Sommet * s)
    {
        struct sommet ** arcs;
    }
    Si vous pouvez em mettre sur une piste ^^

    Cordialement.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Et elle est passée où l'allocation dynamique avec malloc pour l'adresse de ton pointeur ? J'en vois pas !
    Il faut faire une allocation dynamique de ton pointeur avant de vouloir l'utiliser !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Normal tu as juste un pointeur vers un Sommet et non un Sommet.

    Quand tu déclares Sommet S tu as bien un Sommet d'alloué sur la pile c'est une variable automatique.

    Quand tu déclares Sommet *S tu déclares juste une variable capable de pointer sur un Sommet mais ca n'alloue pas un Sommet pour autant.


    Il faut donc que tu alloues dynamiquement ton objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sommet * S = malloc( sizeof Sommet ) ;
    //ou
    Sommet * S = malloc ( sizeof *S ) ;
    puis tester que l'allocation à réussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(S!=NULL) {
    //et enfin accéder aux membre
    S->nbArcs
     
    //ne pas oublier de libérer la mémoire a la fin
    free(S),S=NULL;
     
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 41
    Par défaut
    Il n'est souvent pas necessaire de faire de l'allocation explicite. Lorsque tu as deja une structure, tu peut trouver son adresse avec &:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sommet s;
    Sommet *p = &s;
    s->nbArcs = 7;

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par atnnn
    Il n'est souvent pas necessaire de faire de l'allocation explicite. Lorsque tu as deja une structure, tu peut trouver son adresse avec &:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sommet s;
    Sommet *p = &s;
    s->nbArcs = 7;
    Complétement inutile.Autant directement faire s.nbArcs=7.

    On utilise l'allocation dynamique quand on ne sait pas à l'avance le nombre de Sommet que l'on veut car en ne sachant pas combien de Sommet j'ai besoin j'aurais du mal à ecrire


    Sommet s[100]; Et si j'en ai besoin que de 2 ? Et si j'en ai besoin plus de 100 ?

    Réponse :allocation dynamique.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par hegros
    Complétement inutile.Autant directement faire s.nbArcs=7.
    En effet, mais cela cesse d'être inutile si le pointeur en question est un paramètre de fonction.

    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
    void ModifieSommet(Sommet *pSom)
    {
        pSom->nbArcs = 42;
    }
     
    int main(void)
    {
        Sommet som1;
        Sommet som2;
        Sommet *pSom3 = NULL;
        ModifieSommet(&som1);
        ModifieSommet(&som2);
     
        pSom3 = malloc( sizeof(*pSom3) );
        if(pSom3 != NULL)
        {
            ModifieSommet(pSom3);
            free(pSom3), pSom3=NULL;
        }
        return 0;
    }
    Enfin, évidemment, avec une fonction aussi simple, on peut mettre simplement son contenu dans le main(). Mais avec fonction bien complexe montre l'utilité d'y passer un pointeur...
    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.

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 61
    Par défaut
    Merci pour beaucoup . Je peux avancer ^^

    Cordialement.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par moule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //se situe dans le main
    	Sommet * S;
    	S->nbArcs = 0; //<== ca plante !
    Ta maman, elle t'a jamais dit qu'il ne fallait pas utiliser une variable non-initialisée ? Et ton compilateur, il ne dit rien ? Il est peut être mal réglé :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

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

Discussions similaires

  1. [XMLDocument] Violation d'accès
    Par xant dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 15h39
  2. requete / violation d'accès
    Par marie253 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 13h29
  3. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  4. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 16h46
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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