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 :

désallocation mémoire - fonction - structure - tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Flaherty Mc Coillean
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut désallocation mémoire - fonction - structure - tableau dynamique
    Bonjour j'ai une petite question sur la désallocation de mémoire.

    J'ai une fonction qui renvoie une structure. Dans cette structure il y'a deux éléments : le premier est un tableau de chaine de caractères allouer dynamiquement dans la fonction et le deuxième le nombre de chaines contenues dans le tableau.

    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
     
    struct sortie {
        long nbelt;
        char ** tab;
    };
     
    struct sortie listDIR(char * chemin)
    {
       struct sortie listRAW;
       long nbraw = 0;
     
       /* on lit le contenu d'un dossier et on compte le nombre de fichier raw...*/
     
       char ** tabRAW=malloc(nbraw* sizeof(char*));
       /* suivi d'un autre malloc fonction de la taille de la chaine*/
     
       /*...*/
     
       listRAW.nbelt=nbraw;
       listRAW.tab=tabRAW;
     
       return(listRAW);
    }
     
    int main(void)
    {
    int i, j;
    char PathName[]="/home/flaherty/Documents/convertisseur/";
     
    struct sortie listRAW = listDIR(PathName);
     
    j=(int)listRAW.nbelt;
    for (i=0; i<j;i++)
       {
       printf("%s\n",listRAW.tab[i]);
       }
    }
    Et je me demande déjà est ce que j'ai le droit de faire :
    Et ensuite comment je désalloue la mémoire que j'ai alloué à tabRAW qui devient après listRAW.tab ?

    j'ai le droit de faire dans le main un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i=0;i<(int)listRAW.nbelt;i++)
    {
    free(listRAW.tab[i]);
    listRAW.tab[i]=NULL;
    }
    free(listRAW.tab);
    listRAW.tab=NULL;
    ??

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux, mais pour la désallocation, je te conseillerais de faire une fonction dédiée pour ça, dans le même fichier source que listDIR.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void freeDIR(struct sortie * pRAW)
    {
    	size_t i;
    	if(pRAW==NULL || pRAW->tab==NULL)
    		return;
     
    	for (i=0 ; i<pRAW->nbelt ; i++)
    	{
    		free(pRAW->tab[i]);
    		pRAW->tab[i]=NULL;
    	}
    	free(pRAW->tab);
    	pRAW->tab=NULL;
    }
    Ainsi, le main() aura un truc du genre:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct sortie listRAW = listDIR(PathName);
     
    ...
     
    freeDIR(&listRAW);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Il est préférable d'utiliser des listes chainées si tu veux avoir le contenu d'un répertoire.
    Il faut que tu alloues un "noeud" qui comporte le nom de fichier et les noeuds seront reliés par un système de liste chainée.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/12/2014, 14h34
  2. Réponses: 2
    Dernier message: 14/02/2011, 15h56
  3. Fonction et tableau dynamique
    Par Verbalinsurection dans le forum C++
    Réponses: 11
    Dernier message: 28/08/2009, 17h42
  4. TAD matrice (structure + tableau dynamique)
    Par supermanu dans le forum C
    Réponses: 10
    Dernier message: 13/11/2004, 20h04
  5. tableau dynamique en parametre d'une fonction
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 27/04/2004, 16h35

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