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 :

Pointeur sur structure en paramètre d'entrée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2
    Par défaut Pointeur sur structure en paramètre d'entrée
    Bonjour,

    Je suis un novice en langage C.

    Le problème que je n'arrive pas à résoudre concerne un pointeur sur une structure que j'ai créée (TNoeud).

    J'envoie ce pointeur (racine) en paramètre d'entrée d'une fonction que j'ai appelé inserer. Celle-ci affecte au pointeur racine l'adresse d'un autre pointeur (noeud)

    A la sortie de cette fonction, je m'attends à ce que le pointeur racine dans ma fonction main contienne l'adresse du pointeur créé dans la fonction inserer.

    Or, il n'en est rien le pointeur racine n'a pas été modifié. Pourquoi ? comment faire pour qu'il garde la valeur obtenue dans la fonction inserer ?

    Voici le code :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct Tnoeud Tnoeud;
    struct Tnoeud
    {
      int info;
    };
     
     
    void inserer(Tnoeud *laRacine, int *lenombre)
    {
      //je cree un pointeur et reserve dynamiquement
      //de la memoire egale à la taille de la structure Tnoeud
      Tnoeud *noeud=malloc(sizeof(Tnoeud));
     
      *lenombre=*lenombre+10;
      noeud->info=*lenombre;
      //j'affecte à mon paramètre d'entrée l'adresse de la
      //cellule memoire créée
      laRacine=noeud;
      printf("pendant : %d\n", laRacine);
     
    }
     
    int main()
    {
        // je declare un pointeur racine sur la structure Tnoeud
        //en l'intialisant à null
        Tnoeud *racine=NULL;
        int nombre=10;
     
        printf("avant : %d %d\n", racine, nombre);
        // j'appelle ma fonction inserer sur le pointeur racine
        inserer(racine, &nombre);
        // au retour de la fonction je m'attends à ce que racine
        //ait pris la valeur obtenue dans la fonction inserer
        printf("apres : %d %d\n", racine, nombre);
        // il n'en est rien la valeur de racine est toujours
        // la même. Pourquoi ? comment faire pour qu'elle garde
        // la valeur attribuée dans la fonction inserer ?
        return 0;
    }
    Je vous remercie beaucoup de votre aide. Bien cordialement !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour qu'une fonction modifie un entier, il lui faut un pointeur d'entier.
    Pour qu'une fonction modifie un pointeur, il lui faut un pointeur de pointeur:
    Code C : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct Tnoeud Tnoeud;
    struct Tnoeud
    {
    	int info;
    };
     
     
    void creerNoeudEtIncrementer(Tnoeud **laRacine, int *lenombre)
    {
    	//je cree un pointeur et reserve dynamiquement
    	//de la memoire egale à la taille de la structure Tnoeud
    	Tnoeud *noeud=malloc(sizeof(Tnoeud));
     
    	*lenombre=*lenombre+10;
    	noeud->info=*lenombre;
    	//j'affecte à mon paramètre d'entrée l'adresse de la
    	//cellule memoire créée
    	*laRacine=noeud;
    	printf("pendant : %p\n", *laRacine);
    }
     
    int main()
    {
    	// je declare un pointeur racine sur la structure Tnoeud
    	//en l'intialisant à null
    	Tnoeud *racine=NULL;
    	int nombre=10;
     
    	printf("avant : %p %d\n", racine, nombre);
    	// j'appelle ma fonction inserer sur le pointeur racine
    	creerNoeudEtIncrementer(&racine, &nombre);
    	// au retour de la fonction je m'attends à ce que racine
    	//ait pris la valeur obtenue dans la fonction inserer
    	printf("apres : %p %d\n", racine, nombre);
    	// il n'en est rien la valeur de racine est toujours
    	// la même. Pourquoi ? comment faire pour qu'elle garde
    	// la valeur attribuée dans la fonction inserer ?
    	return 0;
    }
    PS: Pour afficher un pointeur dans printf(), il faut utiliser le format %p.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2
    Par défaut Ponteur sur structure
    Grand merci Médinoc,
    Sans ton intervention, je continuerai encore à tourner en rond !!

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

Discussions similaires

  1. pointeur sur structures
    Par Seimaya dans le forum Débuter
    Réponses: 33
    Dernier message: 26/08/2007, 18h13
  2. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  3. pointeur sur structure
    Par julien.63 dans le forum C
    Réponses: 7
    Dernier message: 04/06/2007, 17h50
  4. problème pointeur sur structure
    Par lejohn dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 13h17
  5. Réponses: 2
    Dernier message: 21/03/2007, 10h55

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