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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 !

+ 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