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 d'accès à un champs d'une structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut Problème d'accès à un champs d'une structure
    Bonjour, je n'arrive pas à acceder à un champs d'une structure, peut être pouriez vous m'aider?

    Voila ma structure simplifiée:

    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
     
    //dans mon .h
     
    struct b {
    char* charb;
    };
     
    struct a {
    struct b strb;
    };
     
    ...
     
    //dans mon .c
     
    char tab[4] = "NULL"
    struct a* stra;
     
    stra->strb.charb=tab;
     
    printf(stderr, "stra->strb.charb=%s", stra->strb.charb);
    J'aimerai et pensais voir affiché "NULL" par mon printf, mais à parrament je vois affiché l'adresse de stra->strb.char et pas son contenu (c'est ce que j'ai compris de mon analyse sous le debbuger gdb car il me met ce qui suit: {charb = 0xbffe05bc ""}).

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Par défaut
    Citation Envoyé par petdelascar Voir le message
    Bonjour, je n'arrive pas à acceder à un champs d'une structure, peut être pouriez vous m'aider?

    Voila ma structure simplifiée:

    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
     
    //dans mon .h
     
    struct b {
    char* charb;
    };
     
    struct a {
    struct b strb;
    };
     
    ...
     
    //dans mon .c
     
    char tab[4] = "NULL"
    struct a* stra;
     
    stra->strb.charb=tab;
     
    printf(stderr, "stra->strb.charb=%s", stra->strb.charb);
    J'aimerai et pensais voir affiché "NULL" par mon printf, mais à parrament je vois affiché l'adresse de stra->strb.char et pas son contenu (c'est ce que j'ai compris de mon analyse sous le debbuger gdb car il me met ce qui suit: {charb = 0xbffe05bc ""}).

    Merci d'avance pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char tab[4] = "NULL"
    struct a* stra;
     
    stra->strb.charb=(char *)malloc(4*sizeof(char));// noublie pas l'allocation de la memoire
    strcpy(tab,stra->strb.charb);
    printf(stderr, "stra->strb.charb=%s", stra->strb.charb);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Merci beaucoup pour ta réponse mais il y a un mais, j'aimerai en fait ne pas à avoir à allouer stra->strb.charb car en fait j'ai plein de pointeur charb dans ma structure qui sont destinés à pointer chacun sur une portion d'une chaine de carractères alloué dynamiquement, je reprend:

    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
     
    //dans mon .h
     
    struct b {
    char* charb;
    char* charc;
    ...
    char* charx;
    };
     
    struct a {
    char* longuechainedetaillevariable;
    struct b strb;
    };
     
    ...
     
    //dans mon .c
     
    struct a* stra;
     
    stra->longuechainedetaillevariable=(char *)malloc(?*sizeof(char));
    //longuechainedetaillevariable a cette allure: "mot1\0mot2\0...motx\0"
     
    //et un truc du genre:
    stra->strb.charb=stra->longuechainedetaillevariable[0]; //Pour pointer sur le mot1
    //(ou stra->strb.charb=stra->&longuechainedetaillevariable[0]; enfin je m'y perd....)
    stra->strb.charc=stra->longuechainedetaillevariable[5]; //Pour pointer sur le mot2
    ...
    stra->strb.charb=stra->longuechainedetaillevariable[X]; //Pour pointer sur le motx
     
    printf(stderr, "stra->strb.charb=%s", stra->strb.charb); //Pour afficher "mot1", etc...
    Peut être que ça ça marche à y reffléchir car je n'ai testé que la méthode précédente (je n'ai pas accès à mon poste).
    Merci encore.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Citation Envoyé par dot-_-net Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char tab[4] = "NULL"
    struct a* stra;
     
    stra->strb.charb=(char *)malloc(4*sizeof(char));// noublie pas l'allocation de la memoire
    strcpy(tab,stra->strb.charb);
    printf(stderr, "stra->strb.charb=%s", stra->strb.charb);
    Oula, ce code est truffé d'erreur :
    1) char tab[4]="NULL" est incorrect, en effet il ne faut pas oublier le '\0' final.
    2) struct a* stra : tu déclares un pointeur sans l'initialiser ce qui n'est pas génial car alors il pointe sur n'importe quoi. En général il est conseillé de l'initialiser avec NULL (ou avec une adresse valide bien entendu).
    3) stra->strb.charb=(char *)malloc(4*sizeof(char)) : premièrement ici tu déréférences stra alors qu'il pointe sur n'importe quoi (donc normalement ça doit planter), deuxièmement comme il a été maintes et maintes fois répété sur le forum il ne faut pas caster le retour d'un malloc, troisièmement il faut vérifier le retour du malloc et pour finir sizeof(char)=1 donc il est inutile de le mettre dans le malloc.
    4) printf(stderr, "stra->strb.charb=%s", stra->strb.charb) : ce n'est pas printf mais fprintf qui s'utilise de cette façon.

    Voilà un code correct :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    struct b
    {
      char *charb;
    };
     
    struct a
    {
      struct b strb;
    };
     
     
    int main(void)
    {
      char tab[5] = "NULL";
      struct a *stra=NULL;
     
      stra=malloc(sizeof(*stra));
      if(stra!=NULL)
        {
          stra->strb.charb=tab;
          printf("stra->strb.charb=%s\n", stra->strb.charb);
        }
      free(stra);
     
      return 0;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par Montag Voir le message
    Voilà un code correct :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    struct b
    {
      char *charb;
    };
     
    struct a
    {
      struct b strb;
    };
     
     
    int main(void)
    {
      char tab[5] = "NULL";
      struct a *stra=NULL;
     
      stra=malloc(sizeof(*stra));
      if(stra!=NULL)
        {
          stra->strb.charb=tab;
          printf("stra->strb.charb=%s\n", stra->strb.charb);
        }
     
      return 0;
    }

    C'est ce que je pense avoir fait et ça marchait pas. Pour info, ma structure contient pleins d'autres choses qui elles sont accessibles, j'ai juste un problème quand je fais ça:stra->strb.charb=tab;
    printf("stra->strb.charb=%s\n", stra->strb.charb);...

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    C'est ce que je pense avoir fait et ça marchait pas. Pour info, ma structure contient pleins d'autres choses qui elles sont accessibles, j'ai juste un problème quand je fais ça:stra->strb.charb=tab;
    printf("stra->strb.charb=%s\n", stra->strb.charb);...
    D'après le code que tu as posté je dirais que ce n'est pas ce que tu as fait.
    As-tu pris en compte les remarques que j'ai faites ?
    As tu essayé de compiler le code que je t'ai donné ?

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par petdelascar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct a* stra;
     
    stra->strb.charb=tab;
    stra n'est pas initialisé. Le comportement est indéfini.

    (manquait un ';') n'est pas une chaine valide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       printf (stderr, "stra.strb.charb=%s\n", stra.strb.charb);
    Le premier paramètre de printf est une chaine de formatage et non un flux. Tu confonds avec fprintf()...

    Ceci fonctionne :
    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
     
    #include <stdio.h>
     
    struct b
    {
       char *charb;
    };
     
    struct a
    {
       struct b strb;
    };
     
    int main (void)
    {
       char tab[] = "NULL";
       struct a stra;
     
       stra.strb.charb = tab;
     
       printf ("stra.strb.charb=%s\n", stra.strb.charb);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    stra.strb.charb=NULL
     
    Press ENTER to continue.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Ok merci à tous pour vos réponses, je pense que mon problème vient d'ailleurs.

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

Discussions similaires

  1. accès au champ d'une structure de structure
    Par darkwall_37 dans le forum Débuter
    Réponses: 0
    Dernier message: 20/04/2010, 22h15
  2. Réponses: 1
    Dernier message: 02/06/2009, 17h50
  3. Problème d'accès aux méthodes d'une classe
    Par RR instinct dans le forum Langage
    Réponses: 5
    Dernier message: 26/06/2006, 14h51
  4. Réponses: 4
    Dernier message: 10/04/2006, 09h28
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

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