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 :

structure imbriquée malloc problème


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 144
    Par défaut structure imbriquée malloc problème
    Bonsoir à tous,
    j'éprouve quelques souci quant à l'allocation dynamique de mémoire sur des structures imbriquées.

    voici mon 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
    typedef struct
    {
      char *intitule;
      char *value;
    } Parametre;
     
    typedef struct
    {
      char *intitule;
      Parametre *parametres;
    } Commande;
     
    Commande * parse_commande ( char * buffer )
    {
      ...
      Commande *com;
      ...
      com = (Commande *) malloc ( sizeof ( Commande ) ); // Allocation de la mémoire pour la commande
      com->parametres = (Parametre *) malloc ( 0 ); // Allocation de la mémoire du tableau de param
      ...
      com->intitule = (char *) malloc ( sizeof (char) * size_intitule ); 
      strncpy ( com->intitule, pt_com1, size_intitule );
      ...
     
      for ( ... )
        {
          ...
          com->parametres = (Parametre *) realloc ( com->parametres, i * sizeof ( Parametre ) );
          ...       
          intitule = (char *) malloc ( sizeof ( char ) * size_intitule_param );
          com->parametres[i].intitule = intitule;
          strncpy ( com->parametres[i].intitule, pt_com1, size_intitule_param );
          ...
          value = (char *) malloc ( sizeof ( char ) * size_value_param );
          ...
          strncpy ( com->parametres[i].value, pt_com1 + size_intitule_param, size_value_param );
     
        }
     
      return com;
    }
    Ce code plante à l'exécution sur le realloc ... Je pense rater qqch mais la je ne vois pas !
    Si quelqun a une idée

    nb : si je n'alloue pas la mémoire des variables de la structure interne à Commande, le code se déroule sans problème... si ça peut aider

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 144
    Par défaut
    Je viens d'essayer cela qui marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
      char *intitule;
      Parametre **parametres;
      int n;
    } Commande;
    Cela donne un tableau de pointeur.
    Ce qui me "turlupine", c'est pourquoi est ce que *parametres ne marche pas, puisque toutes mes autres expériences sur des chaines caractères fonctionnent... Ou alors ça marche pas, et mon programme explosera un jour sur un problème d'allocation mémoire ...

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben ton premier alloc tu lui donnes une taille de zéro.. Donc il n'alloue rien, donc le pointeur n'est pas défini.
    Quand ensuite tu fais un realloc, il veut un pointeur déjà défini en entrée...

    Il suffit de faire ton premer alloc à 1..

  4. #4
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    enleve ton premier malloc
    com->parametres = (Parametre *) malloc ( 0 ); // Allocation de la mémoire du tableau de param
    une taille de 0 ... je sais pas ce que ça donne
    remplace le par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com->parametres = NULL;
    comme ça tu passe NULL a ton realloc, (qui deviens equivalent a un malloc au premier tour de boucle)
    ensuite l'utilisation de realloc est dangereuse.
    si ton realloc echoue, tu perd l'addresse de la zone memoire precedente, il faut passer par un pointeur temporaire, verifier qu'il n'est pas null, et le refiler a com->parametres.
    details: http://emmanuel-delahaye.developpez....es.htm#realloc

    ---

    ah oui:
    -les cast devant les malloc, ça sert a rien.
    -sizeof(char) c'est 1, par definition.

    et dans un souci d'efficacité, jte conseillerais de compter d'abord le nombre d'elements qu'il te faut.
    allouer l'espace, et enfin refaire une boucle pour traiter la chose.

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. Malloc / structures imbriquées
    Par Lolita59 dans le forum C
    Réponses: 14
    Dernier message: 11/05/2006, 15h43
  4. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20
  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