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 free() : Tableau de structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut Problème free() : Tableau de structures
    Bonsoir,

    Je réalise un petit programme dans lequel j'utilise un tableau de structures. Ce tableau est alloué dynamiquement, mais j'ai un souci : je ne peux pas écrire free(tab[i]), voici un exemple qui sera plus parlant :
    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
     
    //ma_struct *tab est initialisé et construit avant
     
     
    int i = 0;
    int nb = 10; //Le nombre de structures dans mon tableau
    ma_struct *tmp = NULL; 
     
    tmp = (adr *) malloc(sizeof(adr) * nb);
     
    if(tmp != NULL)
    {
      for(i = 0; i < nb; i++)
      {
       tmp[i] = tab[i];
       free(tab[i]); // Cette ligne provoque l'erreur "incompatible type for argument 1 of ‘free’"
      }
    }
    Je ne comprends pas pourquoi free(tab[i]) me renvoie cette erreur
    "incompatible type for argument 1 of ‘free’"

    Any idea ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    tab[i] c'est une valeur, c'est à dire que tu passes à free la valeur contenue à l'adresse (tab+i), qui est donc le pointeur sur *(tab+i) notation équivalente dans le langage C à tab[i].

    il faut juste faire free(tab+i) pour libérer le pointeur sur tab[i]. En effet, l'argument reçu par free est un pointeur (une adresse mémoire) et non une valeur comme l'est tab[i]==*(tab+i).


    Si tu ne comprends pas l'explication, la FAQ peut peut être répondre à ta question mieux que moi. Merci en tout cas de me dire si j'ai répondu à ta question.

  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
    il y a plusieurs choses incorrectes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ma_struct *tmp = NULL; 
     
    tmp = (adr *) malloc(sizeof(adr) * nb);
    déjà devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ma_struct *tmp = NULL; 
     
    tmp = (ma_struct *) malloc(sizeof(ma_struct) * nb);
    Ensuite, si tab est alloué, tab[i] est un élément. Donc free(tab[i]) ne veut rien dire.

    Ce devrait être free(tab)

    Et si tab[i] a été alloué, alors écrire tmp = tab[i] en ayant alloué nb*ma_struct pour tmp est idiot et ne veux rien dire non plus.

  4. #4
    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 souviron34
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ma_struct *tmp = NULL; 
     
    tmp = (ma_struct *) malloc(sizeof(ma_struct) * nb);
    Une façon compliquée d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_struct *tmp =  malloc (sizeof *tmp * nb);

  5. #5
    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
    Citation Envoyé par Emmanuel Delahaye
    Une façon compliquée d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_struct *tmp =  malloc (sizeof *tmp * nb);
    oui je sais mais je gardais ce qu'avait fait le PO.


  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut
    Bonjour,

    le problème de type (ma_struct et adr) tient dans le fait que j'ai voulu donné un exemple de mon code, et non mon code complet

    Ce que je veux faire c'est créer un tableau d'éléments de type ma_struct. Ce tableau je devrais l'agrandir donc j'utilise un tableau dynamique.
    L'allocation doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tmp = (ma_struct *) malloc(sizeof(ma_struct) * nb);
    Ensuite, je veux recopier dans ce tableau tmp, mon tableau tab. Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i = 0; i < nb; i++)
    {
     tmp[i] = tab[i];
    }
    Enfin il faut que je libère la mémoire occupée par le premier tableau (tab). Et c'est la que se pose mon problème ...

    Le fait d'écrire free(tab) va bien libérer la mémoire occupée par l'ensemble de mon tableau, n'est-ce-pas ?

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Je ne voudrai pas polluer ce post, mais j'ai toujours cru que pour libérer la mémoire dévolue à un tableau, (1) free(tab) suffisait, et qu'il était inutile de libérer la mémoire pour chaque élément du tableau
    (2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (i=0;i<TailleTableau;i++)
       free(tab+i);
    Quelle est la version correcte ? (1) ou (2)

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Celà dépend si tab[i] a été alloué par un malloc, ou non.
    Si c'est le cas alors il faut la méthode 2 puis éventuellement la méthode 1 si tab a été alloué lui même par un malloc.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    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 bit_o
    Je ne comprends pas pourquoi free(tab[i]) me renvoie cette erreur
    "incompatible type for argument 1 of ‘free’"
    Quel est le type de tab ? Tu peux poster le code complet ?

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

Discussions similaires

  1. [Langage] Problème de tableau de structure
    Par terminator59140 dans le forum Langage
    Réponses: 4
    Dernier message: 09/11/2008, 12h16
  2. Problème de tableau de structures, étrange
    Par Kalyptus dans le forum Débuter
    Réponses: 15
    Dernier message: 08/06/2008, 01h05
  3. Problème avec un tableau de structure
    Par Sofute dans le forum C
    Réponses: 10
    Dernier message: 16/10/2007, 15h29
  4. Réponses: 7
    Dernier message: 21/12/2005, 16h44
  5. Réponses: 21
    Dernier message: 21/11/2005, 09h52

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