+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Membre à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    Par défaut Problème fonction affichage et pointeurs

    Bonjour,
    j'aimerais compiler le programme suivant:
    Code :
    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 Expert Avatar de Trademark
    Inscrit en
    février 2009
    Messages
    763
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 763
    Points : 1 351
    Points
    1 351

    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 :
    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 Confirmé Sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 706
    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 706
    Points : 13 710
    Points
    13 710

    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 :
    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
    Invité régulier
    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 :
    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 chevronné
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2009
    Messages : 332
    Points : 721
    Points
    721

    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 :
    printf ("Adresse de la variable en hexa est: %p\n",pc);

  6. #6
    Invité régulier
    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 à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    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 Confirmé Sénior

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 338
    Points : 5 502
    Points
    5 502

    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.
    • 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 à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    Par défaut

    ok
    et aurait-on pu initialiser le pointeur comme suit:
    char *pc = NULL

    ?

  10. #10
    Modérateur
    Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    janvier 2009
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 640
    Points : 1 155
    Points
    1 155

    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)

  11. #11
    Membre à l'essai
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 21
    Points
    21

    Par défaut

    ok!
    Merci pour tout!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •