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 :

Allocation dynamique d'une structure


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut Allocation dynamique d'une structure
    Bonjour,

    J'ai une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
        char* name;
        Client* members[25];
        int size;
    }Group;
    J'ai besoin de créer un groupe, pour cela j'utilise une fonction createGroup(...) qui renvoit un Group*. J'ai corrigé au fur et à mesure, parce que ça ne fonctionnait pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Première tentative : sans allocation dynamique
    // Problème ça segfault à l'allocation, et je ne comprends pas pourquoi...
    Group* newGroup = createGroup(...);
    Deuxième tentative : allocation dynamique visiblement foireuse, car si l'allocation fonctionne, j'obtiens un message d'erreur étrange lors dela liberation de la mémoire :
    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
    Group* newGroup = malloc(sizeof(Group*));
    newGroup = createGroup(...);
    free(newGroup);
    /* Le message d'erreur :
    *** glibc detected *** ./server: free(): invalid next size (fast): 0x0000000002386030 ***
    ======= Backtrace: =========
    /lib/libc.so.6(+0x77326)[0x7fb67e796326]
    ./server[0x4019cc]
    ./server[0x401772]
    ./server[0x4011ce]
    ./server[0x40187a]
    /lib/libc.so.6(__libc_start_main+0xed)[0x7fb67e74038d]
    ./server[0x400b09]
    ======= Memory map: ========
    [... du blabla ... ]
    */
    Enfin, troisième tentative avec un code trouvé sur le net et adapté, mais dont je ne comprends pas trop la logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Group* newGroup = (Group*)malloc(sizeof(Group));
    newGroup = createGroup;
    free(newGroup);
    Mes questions :
    Pourquoi les deux premières methodes ne fonctionnent-elles pas ?
    Qu'est-ce que cette étrange manière de faire une allocation dans la troisième méthode (le cast et tout ?)

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Group* newGroup = malloc(sizeof(Group*));
    Là, y'a une boulette !! tu n'alloues pas une structure, mais un pointeur de structure (donc la taille d'une adresse)

    On ne voit pas ce que fait createGroup.
    Qu'est-ce que cette étrange manière de faire une allocation dans la troisième méthode (le cast et tout ?)
    Euh ... Si tu trouve ce tuto étrange, il faut revoir toute tes notions d'allocation mémoire en C.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Merci pour les précisions. J'ai probablement foiré ailleurs aussi, j'espère que je pourrai corriger quelques problèmes...

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Enfin, troisième tentative avec un code trouvé sur le net et adapté, mais dont je ne comprends pas trop la logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Group* newGroup = (Group*)malloc(sizeof(Group));
    newGroup = createGroup;
    free(newGroup);
    Mes questions :
    Pourquoi les deux premières methodes ne fonctionnent-elles pas ?
    Qu'est-ce que cette étrange manière de faire une allocation dans la troisième méthode (le cast et tout ?)
    Ce qu'on trouve sur le net n'est pas parole d'évangile et ce code est pervers :

    - La ligne 2 écrase l'adresse renvoyé par le malloc() de la ligne 1 . Résultat : impossible de libérer la mémoire allouée à la ligne 1.
    - Ce cast est inutile en C (mais obligatoire en C++, mais dans ce cas pourquoi faire des malloc() ?)

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    salut !

    en relation avec ton autre post (celui sur printf) ici createGroup rend un pointeur sur Group. c'est sans doute à lui de faire le malloc. (create_group, lui, rend un Group). attention de ne pas mélanger les 2 points de vue.

    A+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    @anacharsis : effectivement j'ai corrigé ça tout à l'heure, et ça va beaucoup mieux. Merci

Discussions similaires

  1. Allocation dynamiques dans une structure
    Par markhor456 dans le forum Débuter
    Réponses: 4
    Dernier message: 20/04/2013, 19h09
  2. Allocation dynamique d'une structure
    Par trall dans le forum C
    Réponses: 11
    Dernier message: 13/05/2010, 09h57
  3. allocation dynamique dans une structure !
    Par grodashe dans le forum C
    Réponses: 2
    Dernier message: 31/12/2009, 11h17
  4. allocation dynamique d'une structure static
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 01/04/2009, 11h22
  5. Réponses: 3
    Dernier message: 02/01/2008, 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