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

    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
    762
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 762
    Points : 1 202
    Points
    1 202

    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
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    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 Pierre-Antoine
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre-Antoine
    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 Titouan Créac'h
    Étudiant
    Inscrit en
    mai 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Nom : Homme Titouan Créac'h
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2009
    Messages : 329
    Points : 644
    Points
    644

    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 Pierre-Antoine
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre-Antoine
    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
    Futur Membre du Club
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 19
    Points
    19

    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é
    Homme Profil pro Pierre
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    1 791
    Détails du profil
    Informations personnelles :
    Nom : Homme Pierre
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 1 791
    Points : 3 736
    Points
    3 736

    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.

  9. #9
    Futur Membre du Club
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 19
    Points
    19

    Par défaut

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

    ?

  10. #10
    Membre émérite Avatar de plxpy
    Homme Profil pro
    Ingénieur
    Inscrit en
    janvier 2009
    Messages
    590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : janvier 2009
    Messages : 590
    Points : 951
    Points
    951

    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
    Futur Membre du Club
    Inscrit en
    janvier 2011
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : janvier 2011
    Messages : 84
    Points : 19
    Points
    19

    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
  •