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 :

Pointeurs et structures: erreur de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Par défaut Pointeurs et structures: erreur de segmentation
    Bonjour à tous,

    débutant en C depuis quelques mois, j'essaie d'attaquer les pointeurs de structure.

    Voici la déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef __VECTEUR_DYNAMIQUE__
    #define __VECTEUR_DYNAMIQUE__
     
    typedef struct donnees_vecteur {
      int taille;
      double *donnees;
    } *vecteur;
    et dans le point 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include "vecteur_dynamique.h"
    #include <stdlib.h>
    #include <stdio.h>
     
    vecteur allouer_vecteur(int taille)
    {
      vecteur v;
      v->taille = taille;
      v->donnees = (double*)malloc(taille * sizeof(double));
     
      if ( v->donnees == NULL ){
         printf("Allocation Impossible");
         exit(1);
      }
     
      return v;
    }
     
    /* [...] */
     
    int main(){
     
      vecteur v = allouer_vecteur(8);
     
      v->donnees[2]=5;
      printf("\n%lf\n",*(acces_vecteur(v,2)));
     
      printf("\nTaille: %d\n",taille_vecteur(v));
     
      liberer_vecteur(v);
      printf("\n%d\n", est_vecteur_invalide(v));
     
      return 0;
    }


    j'ai passé les passages contenant les déclarations/définition des autres foncions car c'est la fonction allouer_vecteur qui pose problème.

    En effet, je n'ai aucune erreur de compilation mais une erreur de segmentation qui provient de cette fonction.

    Ca fait des heures que je cherche et je trouve toujours pas ! : j'aime l'informatique

    Please: HELP
    Images attachées Images attachées   

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par Skize Voir le message
    Voici la déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef __VECTEUR_DYNAMIQUE__
    #define __VECTEUR_DYNAMIQUE__
     
    typedef struct donnees_vecteur {
      int taille;
      double *donnees;
    } *vecteur;
    Cacher un pointeur dans un typedef, c'est MAL. C'est vraiment risquer des ennuis pour rien. Ça se fait beaucoup dans les écoles mais c'est une bidouille pour faire ressembler le langage à autre chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "vecteur_dynamique.h"
    #include <stdlib.h>
    #include <stdio.h>
     
    vecteur allouer_vecteur(int taille)
    {
      vecteur v;
      v->taille = taille;
    Il est là, ton problème : tu déclares un pointeur vers une structure donnee_vecteur, mais tu n'alloues pas la structure proprement dite. Ton pointeur « v » pointe dans le vide. Mais comme tu l'as appelé « vecteur », tu as fait abstraction de ce détail.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    mais c'est une bidouille pour faire ressembler le langage à autre chose.


    Citation Envoyé par Skize Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if ( v->donnees == NULL ){
         printf("Allocation Impossible");
         exit(1);
      }
    Pas bien. Un des principes de base est que si on appelle une fonction, la fonction doit nous rendre la main quoi qu'il arrive (et pas quitter le programme avec exit()).
    S'il y a un problème, la fonction renvoie alors une valeur spéciale et c'est à l'appelant de gérer le problème. La fonction ne doit pas quitter le programme.

    Imagine ce qui se passerait si malloc() quittait par exit() dès qu'une allocation échoue ? Tu ne pourrais jamais savoir que ça a échoué... Ben c'est le même principe pour les fonctions que tu crées...
    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]

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Par défaut
    Merci à vous, j'ai rajouté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v=malloc(sizeof(vecteur));
    dans le code de ma fonction et enlevé exit(1). Tout marche nikel.

    Je contine mon apprentissage ,à + tard

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Tout marche nickel.
    C'est un coup de bol !
    N'oublis pas que vecteur est un type pointeur
    sizeof(vecteur) te retourneras la taille d'un pointeur.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par Skize Voir le message
    Merci à vous, j'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v=malloc(sizeof(vecteur));
    dans le code de ma fonction et enlevé exit(1). Tout marche nikel.
    Citation Envoyé par Lucien63 Voir le message
    C'est un coup de bol !
    N'oublis pas que vecteur est un type pointeur
    sizeof(vecteur) te retourneras la taille d'un pointeur.
    +1

    Skize : retire l'étoile « * » dans un premier temps et essaie de faire un programme qui compile comme ça. Comme on te l'a dit, c'est le meilleur moyen de rendre confus quelque chose qui, à la base, ne l'est pas du tout.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2012, 12h18
  2. Incrémentation d'un élément de structure : erreur de segmentation
    Par BOByTOX dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 27/04/2011, 18h37
  3. erreur de segmentation sur affectation champ enum structure
    Par marion5515 dans le forum Débuter
    Réponses: 9
    Dernier message: 24/02/2010, 11h51
  4. Réponses: 7
    Dernier message: 20/01/2010, 11h23
  5. Réponses: 20
    Dernier message: 11/07/2006, 17h11

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