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 :

Double pointeur sur structure, libération et allocation de mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Par défaut Double pointeur sur structure, libération et allocation de mémoire
    Bonjour,

    J'ai un petit problème avec l'allocation et la libération de cette structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        typedef struct AudioMegaConvertPlugin {
            char filtreOpen[size...];
            char filtreSave[size...];
            /* .... */
        }  AudioMegaConvertPlugin, * lpAudioMegaConvertPlugin;
    Enfait, le problème est pendant l'allocation et après pour la libération, je ne suis pas sûr que mon code soit juste.
    Je veux allouer autant de structures que j'en ai besoin, donc à chaque boucle, j'en alloue une nouvelle, voila la 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
    AudioMegaConvertPlugin **amCplugin = {NULL};
    /* ou (lpAudioMegaConvertPlugin  *amCplugin) */
    amCplugin = malloc(sizeof(AudioMegaConvertPlugin*));
     
    /* ======== BOUCLE */
    /* Quand je veux une nouvelle structure, je fais */
    *amCplugin = malloc(sizeof(AudioMegaConvertPlugin));
     
    /* Puis je veux par exemple remplir le membre 'filtreOpen' et le membre 'filtreSave' (ici par l'appel d'un plugin) */
    dllStartV((*amCplugin)->filtreOpen, (*amCplugin)->filtreSave);
     
    /* Maintenant, je veux une nouvelle structure sur le meme
       pointeur donc, je fais: (C'EST LA QU'IL Y A UN PROBLEME) */
    ++amCplugin;
    /* Et je recommence comme au dessus, malloc(), etc. */
    /* ======== FIN BOUCLE */
     
     
    /* ======== Puis arrive a la fin du programme, (2eme PROBLEME...)
      je veux liberer ce fameux truc... 
      donc, je fais tant que (*amCplugin  != NULL) free(amCplugin);
      Mais je ne sais pas "où commence" "amCplugin" (emplacement memoire)
      alors j'ai enregistre au debut du programme sa valeur par la variable
      PluginAdress, comme cela: (PluginAdress = (int) amCplugin;) */
     
        for(amCplugin = (int) PluginAdress ;
            *amCplugin != NULL ; free(*amCplugin), ++amCplugin) ;
    /* Mais mon compilo n'a pas l'air de trouver ca marrant, il me sort:
       [Warning] assignment makes pointer from integer without a cast */
    Si quelqu'un pourrait me dire comment faire une libération correcte et une allocation correcte car le "++amCplugin;" ne me semble pas correct, d'ailleur j'ai testé avec beaucoups de boucles et j'ai eu:
    Runtime Error!

    Program : E:\[AudioMega]\scr\AudioMega.exe

    This application has requested the Runtime to terminate it in an unsual way.
    Please contact the application's support team for more information.
    quand je faisais le "++amCplugin;"



    Merci

  2. #2
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    J'initialiserai le tableau de pointeur.

    Puis j'utiliserai des index.

    Donc par exemple :

    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
     
    const unsigned nb_element_max = 10;
    unsigned nb_element = 0;
     
    AudioMegaConvertPlugin **amCplugin = {NULL};
    amCplugin = malloc(nb_element_max * sizeof(AudioMegaConvertPlugin*));
    memset(amCplugin, 0, nb_element_max * sizeof(AudioMegaConvertPlugin*));
     
    while(nb_element < nb_element_max)
    {
    amCplugin[nb_element] = malloc(sizeof(AudioMegaConvertPlugin));
    /* test si bien alloue etc */
    dllStartV(amCplugin[nb_element]->filtreOpen, amCplugin[nb_element]->filtreSave);
    nb_element++; 
    }
     
    while(nb_element)
    {
    delete amCplugin[nb_element];
    nb_element--;
    }
    delete amCplugin

    Tu peux aussi faire un tableau qui se fini toujours par un pointeur NULL. et faire une sorte de tant que pointeur pas null alors delete le pointeur. Mais apres cela dépend de ce qe tu fais avec ton tableau.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Par défaut
    Merci mais je compile en C (delete existe en C ?).
    <reEdit> Mais le problème sur ton code c'est qu'on est limité sur 'element_max', alors que moi je veux quelque chose que totalement indépendant, qui peux fonctionner même avec 5600560560918456 plugins :-)

    n'y a t-il pas moyen 'tout simplement' d'utiliser realloc() (sauf que je n'y arrive pas ).

  4. #4
    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
    Bon je crois qu'il faut reprendre à la base...

    1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AudioMegaConvertPlugin **amCplugin = {NULL};
    /* ou (lpAudioMegaConvertPlugin  *amCplugin) */
    amCplugin = malloc(sizeof(AudioMegaConvertPlugin*));
    ici tu alloues la place pour 1 pointeur de type amCplugin

    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    * Quand je veux une nouvelle structure, je fais */
    *amCplugin = malloc(sizeof(AudioMegaConvertPlugin));
    ici tu ne fais pas ce que tu crois.... Ce n'est pas le CONTENU du pointeur alloué plus haut que tu veux modifier, c'est le premier élément du tableau....


    Comme en 1) tu as créé un TABLEAU de pointeurs à 1 élément, L'écriture correcte et conforme est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    * Quand je veux une nouvelle structure, je fais */
    amCplugin[0] = malloc(sizeof(AudioMegaConvertPlugin));
    3)

    Incrémente l'adresse d'un tableau de pointeurs...

    Tu ne peux pas faire ça.....


    Ce que tu veux faire c'est :


    • Stocker un nombre d'éléments (par exemple nbPlugin) initialisé à 0.

    • Allouer (ou réallouer, avec dans ce cas une variable intermédiaire) nbPlugin+1 adresses d'éléments (le tableau) ( 1) modifié)

    • Allouer pour l'indice en question la place pour une structure ( 2) modifié)

    • Si tout s'est bien passé incrémenter le nombre d'éléments nbPlugin

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 76
    Par défaut
    Ok, c'est bien ce qu'il me semblait mais je ne savais pas trop comment le "formuler", merci pour ta réponse.

    Donc, je dois:
    O Allouer amCplugin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    amCplugin = malloc(sizeof(AudioMegaConvertPlugin *));
    nbPlugins = 0;
    size_t sizeAmCplugin = 1;
    (j'ai donc un tableau de 1 case (amCplugin[0])

    O Allouer une structure dans cette premiere case du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    amCplugin[nbPlugins] = malloc(sizeof(AudioMegaConvertPlugin));
    O Remplir mon tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dllStartV(amCplugin[nbPlugins]->filtreOpen, amCplugin[nbPlugins]->filtreSave);
    /* .... */
    O Faire un realloc() sur amCplugin pour avoir un nouvelle case dans le tableau et incrementer 'nbPlugins'; (pas sûr)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ++sizeAmCplugin;
    realloc(amCplugin, sizeAmCplugin * sizeof(AudioMegaConvertPlugin *))
    O Allouer une structure dans cette 2eme case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    amCplugin[nbPlugins] = malloc(sizeof(AudioMegaConvertPlugin));
    O Remplir le tableau
    O ETC...

    O Pour la libération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(; nbPlugins >= 0 ; free(amCplugin[nbPlugins]) , --nbPlugins) ;
    free(amCplugin);

    Correct ?

  6. #6
    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
    Oui à 2 ou 3 nuances près :

    1. Ton free ne libère que le tableau, pas les structures

    2. Vérifier que les retours d'allocation sont corrects, et sinon prévoir des échapatoires

    3. Pour le realloc, passer par un buffer temporaire, car si ça échoue, tu n'auras plus accès au tableau précédemment alloué

    4. Pour la libération, pourquoi ne pas faire une boucle claire ?

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      for ( i = (nbPlugins-1) ; i >= 0 ; i-- )
         free (amCplugin[i]);
       
      free(amCplugin);

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

Discussions similaires

  1. lire pointeur sur structure en argument
    Par Linu6 dans le forum C
    Réponses: 3
    Dernier message: 23/09/2007, 00h53
  2. pointeur sur structures
    Par Seimaya dans le forum Débuter
    Réponses: 33
    Dernier message: 26/08/2007, 18h13
  3. pointeur sur structure
    Par julien.63 dans le forum C
    Réponses: 7
    Dernier message: 04/06/2007, 17h50
  4. problème pointeur sur structure
    Par lejohn dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 13h17
  5. Réponses: 2
    Dernier message: 21/03/2007, 10h55

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