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 :

Malloc / structures imbriquées


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut Malloc / structures imbriquées
    je suis en train de créer une trame SNMP
    Voila, j'ai une structure de ce type.

    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
     
    typedef struct
    {
    char           *tag;
    int            longueur;
    char           *valeur;
    }CODAGECHAR;
     
    typedef struct
    {
    char           *tag;
    int            longueur;
    int            valeur;
    }CODAGEINT;
     
    typedef struct
    {
    char           *tag;
    int            longueur;
    unsigned long  *valeur;
    }CODAGEADDR;
     
    typedef struct
    {
    CODAGEINT           *version;
    CODAGECHAR          *community;
    CODAGEINT           *typetrap;
    CODAGECHAR          *oid ;
    CODAGEADDR          *manaddr;
    CODAGECHAR          *spef;
    CODAGECHAR          *error;
    CODAGECHAR          *timeticks;
    CODAGECHAR          *date;
    CODAGECHAR          *type;
    CODAGECHAR          *code;
    CODAGECHAR          *par1;
     
     
    }TRAPSENDER;
    Pour pouvoir la remplir, je dois faire une allocation malloc dans mon prog principal.

    je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TRAPSENDER tramesnmp;
     
    tramesnmp = malloc (20000);
    Et quand je veux remplir ma structure, tout se crache,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tramesnmp->version->valeur = 0;

    Je comprend pas
    si vous aviez une idée ou deux ça m'aiderait

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Si tu veux allouer dynamiquement il faut faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TRAPSENDER * tramesnmp = NULL;
     
    tramesnmp = malloc (20000 * sizeof (* tramesnmp));
     
    if (! tramesnmp)
    {
       /* ... Gestion d'erreur en cas d'erreur de malloc ... */
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut
    je comprend pas la partie :

    sizeof (* tramesnmp)
    comment il peut savoir la taille de tramesnmp alors que c'est justement ce que lui demande de créer...

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Lolita59
    je comprend pas la partie :

    sizeof (* tramesnmp)
    comment il peut savoir la taille de tramesnmp alors que c'est justement ce que lui demande de créer...

    * tramesnmp
    est un pointeur sur une structure de type TRAPSENDER donc il connais forcément la taille de l'objet sur lequel il pointe ... !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (! tramesnmp)
    {
       /* ... Gestion d'erreur en cas d'erreur de malloc ... */
    }

    depuis que j'ai mis ça avant de remplir mes champs ça tourne mais il ne rentre jamais dans le if

    comprend toujours pas moi

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Lolita59
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (! tramesnmp)
    {
       /* ... Gestion d'erreur en cas d'erreur de malloc ... */
    }

    depuis que j'ai mis ça avant de remplir mes champs ça tourne mais il ne rentre jamais dans le if

    comprend toujours pas moi
    Cette condition n'est utilisée que lorsque l'allocation de mémoire échoue c'est tout, si tu préfère une autre forme plus compréhenssible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (tramesnmp == NULL)
    {
       /* ... Erreur d'allocation ... gérer le comportement du programme ... */
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut
    Ah oki c le ! que j'avais mal interprété

    Merci beaucoup, je m'en vais tester ça voir si ça tourne bien maintenant

  8. #8
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut
    En fait ça change pas le pb. Le prog se crashe a la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    tramesnmp = malloc (2000* sizeof (* tramesnmp));
     
              /*** mise en forme de la version du protocole SNMP ***/
              tramesnmp->version->valeur = 0;     <---ici
              tramesnmp->version->longueur = sizeof ( tramesnmp->version->valeur );

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Cette allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tramesnmp = malloc (2000* sizeof (* tramesnmp));
    indique que tout simplement tu créé un tableau de structure de 2000 indice donc de ce fait, pour accéder à un indice précis tu dois faire comme celà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*** mise en forme de la version du protocole SNMP ***/
    /* Ceci pour le premier indice du tableau biensur ! */
    tramesnmp[0]->version->valeur = 0;     <---ici
    tramesnmp[0]->version->longueur = sizeof ( tramesnmp[0]->version->valeur );
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Lolita59
    En fait ça change pas le pb. Le prog se crashe a la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    tramesnmp = malloc (2000* sizeof (* tramesnmp));
     
              /*** mise en forme de la version du protocole SNMP ***/
              tramesnmp->version->valeur = 0;     <---ici
              tramesnmp->version->longueur = sizeof ( tramesnmp->version->valeur );
    Non, il faudra faire un malloc par élément dans ta structure:

    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
     
     
    tramesnmp = malloc (sizeof (* tramesnmp));
    if(tramesmp==NULL)
     {
      /*Gestion erreur*/
     }     
     
    tramesnmp->version = malloc(sizeof *(tramesnmp->version));
    if(tramesnmp->version==NULL)
      {
      /*Gestion erreur*/
      }
     
    /*Pareil pour tous les autres pointeurs...*/
    Jc

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Franck.H
    Cette allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tramesnmp = malloc (2000* sizeof (* tramesnmp));
    indique que tout simplement tu créé un tableau de structure de 2000 indice donc de ce fait, pour accéder à un indice précis tu dois faire comme celà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*** mise en forme de la version du protocole SNMP ***/
    /* Ceci pour le premier indice du tableau biensur ! */
    tramesnmp[0]->version->valeur = 0;     <---ici
    tramesnmp[0]->version->longueur = sizeof ( tramesnmp[0]->version->valeur );
    Mais la zone mémoire pour version n'est pas alloué pour aucun des indices...

    Jc

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Hum oui je suis bête, j'avais pas vu que c'était également des pointeurs dans cette structure mille excuse
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut
    A la base je voulais créer un buffer d'une taille de 2000 pour voir ce qui se passait.

    Compte tenu que je ne crée qu'une seule trame SNMP à la fois, il ne me faut que 1 indice de cette structure.

    Mais j'ai du mal a comprendre comment il fait pour savoir la taille de la structure avec les données dedans

    parce que rien que si je met un int = 5 ou =15, ça fera deja pas la meme taille. Alors imagine les variations sur toutes les valeurs possibles de ma structure

  14. #14
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Lolita59
    A la base je voulais créer un buffer d'une taille de 2000 pour voir ce qui se passait.

    Compte tenu que je ne crée qu'une seule trame SNMP à la fois, il ne me faut que 1 indice de cette structure.

    Mais j'ai du mal a comprendre comment il fait pour savoir la taille de la structure avec les données dedans

    parce que rien que si je met un int = 5 ou =15, ça fera deja pas la meme taille. Alors imagine les variations sur toutes les valeurs possibles de ma structure
    Tu as des pointeurs dans ta structure donc tu alloues la mémoire pour ta trame et ensuite tu alloues pour chaque zone nécessaires pour le trame...

    Exemple:

    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
     
    typedef struct sa
    {
    int a,b,c;
    }A;
     
    typedef struct sb
     {
     int a,b,c; 
    float fa,fb,fc;
    }B;
     
     
    typedef struct sglobal
    {
    int c,d;
    A *test;
    B *lol;
    }global;
    Donc si on veut allouer la mémoire pour une structure globale, on va demander une zone mémoire pour la structure globale.

    Si malloc fonctionne, on va devoir allouer de la zone pour les deux structures internes.

    Donc 2 malloc de plus qui vont allouer de la place pour les structure de type A et de type B.

    C'est avec les pointeurs qu'on liera la structure englobante aux 2 autres internes.

    Et si ces structures internes avaient des pointeurs de structures internes, on ferait encore des malloc en plus.

    Ce qui donnerait en 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
     
    Global *g = malloc(sizeof *g);
    if(g==NULL)
      {
      /*Gestion erreur*/
      }
     
    g->test = malloc(sizeof *(g->test));
    if(g->test==NULL)
       {
       /*Gestion erreur*/
       }
     
    g->lol = malloc(sizeof *(g->lol));
     if(g->lol==NULL)
        {
        /*Gestion erreur*/
        }
    Jc

  15. #15
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Par défaut
    oki je vois

    je me rappellais plus qu'il fallait allouer pour chaque structure
    je vais aller tester ça

    merci beaucoup

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

Discussions similaires

  1. Structures imbriquées avec malloc
    Par beegees dans le forum C
    Réponses: 19
    Dernier message: 26/11/2007, 16h42
  2. Réponses: 6
    Dernier message: 12/04/2007, 13h58
  3. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  4. structure imbriquée malloc problème
    Par tuxout dans le forum C
    Réponses: 3
    Dernier message: 26/02/2007, 06h49
  5. Réponses: 3
    Dernier message: 20/11/2005, 20h04

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