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 fonction affichage et pointeurs


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut Problème fonction affichage et pointeurs
    Bonjour,
    j'aimerais compiler le programme suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdlib.h>
    #include <stdio.h>
     
    int main () {
      char *pc;
      *pc = 34;
      printf ("Contenu de la variable pointee par pc est: %c\n",*pc);
      printf ("Adresse de la variable en hexa est: %p\n",&pc);
      return EXIT_SUCCESS;
    }
    Je compile sans erreur et quand je lance le programme, j'ai le message d'erreur suivant: Erreur de segmentation (core dumped)

    Merci!

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Quand tu déclares :

    Le programme réserve 8 octets de mémoire en variable local. Ces 8 octets de mémoires sont destinés à contenir une adresse qui pointera vers quelque part dans la mémoire.

    Or, en C, si tu n'initialises pas une variable, son contenu est aléatoire (disons que c'est ce qu'il y avait en mémoire avant qui est utilisé).

    Par conséquent, on en déduit que ce qui avait en mémoire avant ne correspond pas à une adresse valide dans ton programme. Tu feras donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* pc = malloc(sizeof(char));
    *pc = 34;
    free(pc);
    Et tout ira mieux. Évidemment ta variable pc pointe vers un espace non local donc qui n'est pas libéré implicitement et donc qu'il faut libérer à la main avec free.

    Je te conseille vivement de lire un livre sur le C.

  3. #3
    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
    Pour stocker la donnée (34), il te faut définir un objet : char data;.
    Tu veux accéder à cet objet explicitement par son adresse et tu crées un objet pour stocker cette adresse (pointeur) et tu mets l'adresse dedans : char * pc = &data;.
    Le programme devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <stdio.h>
    int main (void) 
    {
      char data; 
      char *pc = &data;
      *pc = 34;                                                       // ou data = 34
      printf ("Contenu de la variable pointee par pc est: %c\n",*pc); // ou data
      printf ("Adresse de la variable en hexa est: %p\n",pc);         // ou &data
      printf ("Adresse du pointeur en hexa est: %p\n",&pc);
      return EXIT_SUCCESS;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Salut,
    Dans le C tu as aussi besoin d'allocation mémoire,
    Ici tu veux stocker 34 dans pc, qui correspond à un caractère dans la table ASCII, sans y avoir alloué de la mémoire.
    Essaye donc plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main ()
    {
      char *pc;
     
      pc = malloc(sizeof(*pc) * 1);
      *pc = 34;
     
     printf ("Contenu de la variable pointee par pc est: %c\n",*pc);
     printf ("Adresse de la variable en hexa est: %p\n",&pc);
    }
    Sans le malloc, tu essayais donc de toucher de la mémoire qui n'était pas allouée a ton programme, d'où le SEGMENTATION FAULT

    Bonne journée

  5. #5
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    attention, dans cette affichage, tu n'as pas besoins du '&' étant donné que "pc" est déjà un pointeur sur char.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("Adresse de la variable en hexa est: %p\n",pc);

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    En effet,
    Je lui expliquais juste pourquoi son programme SEGFAULT

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    ok j'ai compris!
    Une dernière question:

    char *pc = &data

    est bien équivalent à :

    char *pc;
    pc = &data;

    Merci.

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    quasiment.
    La subtilité (qui te sera surtout utile si tu fais du C++) est que dans la première forme, la variable pc est construite avec la valeur de &data, tandis que dans la seconde, sans optimisation, pc est construite par défaut, puis reçoit une valeur.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    ok
    et aurait-on pu initialiser le pointeur comme suit:
    char *pc = NULL

    ?

  10. #10
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Oh que oui ! C'est généralement sous cette forme qu'on initialise un pointeur pour bien montrer/mémoriser qu'aucune allocation mémoire correspondante n'a été faite (NULL, soit 0, n'est jamais une adresse valide)
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    ok!
    Merci pour tout!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/11/2007, 10h26
  2. Problème fonction affichage listes déroulantes
    Par JLDR69 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/09/2006, 19h06
  3. Problème d'affichage en fonction de la situation
    Par HwRZxLc4 dans le forum Langage
    Réponses: 4
    Dernier message: 14/08/2006, 21h07
  4. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20
  5. Réponses: 3
    Dernier message: 10/01/2006, 14h01

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