Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 21h32   #1
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
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!
Glork est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/12/2012, 21h49   #2
Trademark
Membre émérite
 
Avatar de Trademark
 
Inscription : février 2009
Messages : 563
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 563
Points : 806
Points : 806
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.
Trademark est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 22h29   #3
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 435
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 435
Points : 12 967
Points : 12 967
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/12/2012, 09h32   #4
OriginSpooK
Invité régulier
 
Homme Pierre-Antoine
Étudiant
Inscription : 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
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
OriginSpooK est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/12/2012, 10h38   #5
EpiTouille
Membre expérimenté
 
Avatar de EpiTouille
 
Homme Titouan Créac'h
Epitech
Inscription : mai 2009
Messages : 250
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Epitech

Informations forums :
Inscription : mai 2009
Messages : 250
Points : 529
Points : 529
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);
EpiTouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 10h40   #6
OriginSpooK
Invité régulier
 
Homme Pierre-Antoine
Étudiant
Inscription : 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
En effet,
Je lui expliquais juste pourquoi son programme SEGFAULT
OriginSpooK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 18h28   #7
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
ok j'ai compris!
Une dernière question:

char *pc = &data

est bien équivalent à :

char *pc;
pc = &data;

Merci.
Glork est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 18h36   #8
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 220
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 220
Points : 2 596
Points : 2 596
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.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h11   #9
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
ok
et aurait-on pu initialiser le pointeur comme suit:
char *pc = NULL

?
Glork est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h18   #10
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 494
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
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 : 494
Points : 893
Points : 893
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)
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 20h06   #11
Glork
Candidat au titre de Membre du Club
 
Inscription : janvier 2011
Messages : 34
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 34
Points : 11
Points : 11
ok!
Merci pour tout!
Glork est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h20.


 
 
 
 
Partenaires

Hébergement Web