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 :

probleme allocation dynamique de mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut probleme allocation dynamique de mémoire
    Bonjour,

    Je veux allouer de la mémoire dynamiquement pour 4 tableaux à 2 dimensions mais lors de l'éxécution, le test m'informe que l'allocation est impossible. Je programme sous labwindows CVI 8.5. Voici le 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    TabTimePalAlim=(int**) calloc(5,sizeof(int*));
      for(i=0; i<NbAlim; i++)
       TabTimePalAlim[i]=(int*) calloc(5,sizeof(int)); 
     
      if(TabTimePalAlim[i]==NULL)
       {
       MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
       for(i=0; i<5; i++)
        {
        free(TabTimePalAlim[i]);
        TabTimePalAlim[i]=NULL;
        }
       free(TabTimePalAlim);
       TabTimePalAlim=NULL;
       }
     
      TabValPalAlim=(double**) calloc(5,sizeof(double*));
      for(i=0; i<NbAlim; i++)
       TabValPalAlim[i]=(double*) calloc(5,sizeof(double));
     
      if(TabValPalAlim[i]==NULL)
       {
       MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
       for(i=0; i<5; i++)
        {
        free(TabValPalAlim[i]);
        TabValPalAlim[i]=NULL;
        }
       free(TabValPalAlim);
       TabValPalAlim=NULL;
       }
     
     
      TabTimePalCh=(int**) calloc(5,sizeof(int*));
      for(i=0; i<NbCharge; i++)
       TabTimePalCh[i]=(int*) calloc(5,sizeof(int));
     
      if(TabTimePalCh[i]==NULL)
       {
       MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
       for(i=0; i<5; i++)
        {
        free(TabTimePalCh[i]);
        TabTimePalCh[i]=NULL;
        }
       free(TabTimePalCh);
       TabTimePalCh=NULL;
       }
     
      TabValPalCh=(double**) calloc(5,sizeof(double*));
      for(i=0; i<NbCharge; i++)
       TabValPalCh[i]=(double*) calloc(5,sizeof(double));
     
      if(TabValPalCh[i]==NULL)
       {
       MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
     
       for(i=0; i<5; i++)
        {
        free(TabValPalCh[i]);
        TabValPalCh[i]=NULL;
        }
       free(TabValPalCh);
       TabValPalCh=NULL;
       }
    A chaque démarrage, le problème reviend. J'ai essayer avec la fonction malloc et l'allocation se fait correctement mais lors de la réallocation de mémoire (realloc) les problèmes reviennes (run time error:Attempt to realloc pointer to freed memory ).
    voici la réallocation pour infos:

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    TabTimePalAlim=realloc(TabTimePalAlim, NbAlim*sizeof(int*));
         TabTimePalAlim=realloc(TabTimePalAlim, NbPal*sizeof(int));
     
         if(TabTimePalAlim == NULL)
         {
         for(i=0; i<NbPal; i++)
          {
          free(TabTimePalAlim[i]);
          TabTimePalAlim[i]=NULL;
          }
         free(TabTimePalAlim);
         TabTimePalAlim=NULL;
         }
     
     
         TabValPalAlim=realloc(TabValPalAlim, NbAlim*sizeof(double*));
         TabValPalAlim=realloc(TabValPalAlim, NbPal*sizeof(double));
     
         if(TabValPalAlim == NULL)
         {
         for(i=0; i<NbPal; i++)
          {
          free(TabValPalAlim[i]);
          TabValPalAlim[i]=NULL;
          }
         free(TabValPalAlim);
         TabValPalAlim=NULL;
         }
     
         TabValPalCh=realloc(TabValPalCh, NbAlim*sizeof(double*));
         TabValPalCh=realloc(TabValPalCh, NbPal*sizeof(double));
     
         if(TabValPalCh == NULL)
         {
         for(i=0; i<NbPal; i++)
          {
          free(TabValPalCh[i]);
          TabValPalCh[i]=NULL;
          }
         free(TabValPalCh);
         TabValPalCh=NULL;
         }
     
         TabTimePalAlim=realloc(TabTimePalCh, NbAlim*sizeof(int*));
         TabTimePalAlim=realloc(TabTimePalCh, NbPal*sizeof(int));
     
         if(TabTimePalCh == NULL)
         {
         for(i=0; i<NbPal; i++)
          {
          free(TabTimePalCh[i]);
          TabTimePalCh[i]=NULL;
          }
         free(TabTimePalCh);
         TabTimePalCh=NULL;
         }
    Pourriez vous me dire quel est le problème?

    Je vous remercie.

  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
    Tu aurais du utiliser les balises code pour rendre ton message un peu moins indigeste.

    Et puis je n'ai pas tout lu, j'ai plutot rien compris mais je crois pouvoir dire sans me tromper qu'il y a quelque chose de louche derrière cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TabTimePalAlim=realloc(TabTimePalAlim, NbAlim*sizeof(int*));
    TabTimePalAlim=realloc(TabTimePalAlim, NbPal*sizeof(int));
    La taille ne devrait-elle pas augmenter ?
    Ne devrais-tu pas vérifier le retour de realloc ?
    Mais que fait la police ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    Citation Envoyé par valefor Voir le message
    Tu aurais du utiliser les balises code pour rendre ton message un peu moins indigeste.

    Et puis je n'ai pas tout lu, j'ai plutot rien compris mais je crois pouvoir dire sans me tromper qu'il y a quelque chose de louche derrière cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TabTimePalAlim=realloc(TabTimePalAlim, NbAlim*sizeof(int*));
    TabTimePalAlim=realloc(TabTimePalAlim, NbPal*sizeof(int));
    La taille ne devrait-elle pas augmenter ?
    Ne devrais-tu pas vérifier le retour de realloc ?
    Mais que fait la police ?
    Oui désolé, c'est vrai que c'est pas très lisible. Ce que j'ai fournis me permet en fait d'allouer de la mémoire pour 4 tableaux 2D (TabTimePalAlim, TabValPalAlim, TabTimePalCh et TabValPalCh). Dans ces tableaux je stocke des données en fonction de deux valeurs (numero outils et numero palier) concernant la configurations de mes outils qui me serviront à les piloter plus tard. Ici, j'essaie d'allouer dc mes 4 tableaux en faisant les test d'allocations à chaque fois. J'utilise la fonction "calloc" pour initialiser mes tableaux avec des valeurs "0". Les tableaux sont initialement (a l'initialisation du programme) créer sur 5 bit. Ensuite lors se que je veux utiliser ces tableaux pour stocké mes données, je réalloue la mémoire en fonction du nombre de palier configurer (NbPal) et du nombre d'outil utiliser (NbAlim) afin de ne pas utiliser de la memoire pour rien. La taille des tableau peut donc augmenter ou diminuer selon la configuration initiale choisit.

    Concernant la vérification du retour de realloc, je ne comprend pas trop ce que tu veu dire. Je suis débutant en allocation de mémoire.

    Peut tu m'éclairer un peu?

    Je te remercie

  4. #4
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TabTimePalAlim=realloc(TabTimePalAlim, NbAlim*sizeof(int*));
         TabTimePalAlim=realloc(TabTimePalAlim, NbPal*sizeof(int));
     
         if(TabTimePalAlim == NULL)
         {
         for(i=0; i<NbPal; i++)
          {
          free(TabTimePalAlim[i]);
          TabTimePalAlim[i]=NULL;
          }
         free(TabTimePalAlim);
         TabTimePalAlim=NULL;
         }
    Est incorrect:

    - Pourquoi cette double reallocation sur TabTimePalAlim ?
    - Si TabTimePalAlim == NULL alors TabTimePalAlim[i] est illégal.

    De plus :

    - La réallocation peut échouer et, dans ce cas, TabTimePalAlim est placé à NULL et la mémoire anciennement allouée n'est plus accessible et perdue.
    Ranger le résultat du realloc dans un pointeur intermédiaire et si il est différent de NULL, le recopier dans TabTimePalAlim. On conserve alors, en cas d'échec, l'accès à la mémoire précédemment allouée via TabTimePalAlim.

    - Le premier realloc change le nombre de pointeurs sur int.
    Si ce nombre de pointeurs est plus petit qu'avant, les pointeurs sur int en excédent sont perdus et il est impossible de récupérer la mémoire sur laquelle il pointe
    Si ce nombre est plus grand qu'avant, les nouveaux pointeurs ne sont pas initialisés. On doit faire (éventuellement, si le nombre d'éléments a changé) une realloc sur les anciens TabTimePalAlim[i] (avec les mêmes précautions) et une allocation sur les nouveaux.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TabTimePalAlim=realloc(TabTimePalAlim, NbAlim*sizeof(int*));
         TabTimePalAlim=realloc(TabTimePalAlim, NbPal*sizeof(int));
     
         if(TabTimePalAlim == NULL)
         {
         for(i=0; i<NbPal; i++)
          {
          free(TabTimePalAlim[i]);
          TabTimePalAlim[i]=NULL;
          }
         free(TabTimePalAlim);
         TabTimePalAlim=NULL;
         }
    Est incorrect:

    - Pourquoi cette double reallocation sur TabTimePalAlim ?[/INDENT]
    La double réallocation se fait pour les deux dimensions puisque je peux modifier NbAlim (1ère dimension) et NbPal(2ième dimension). Je pensai donc qu'il fallais réallouer la mémoire pour les deux dimensions.

    Ai je raison?

    Citation Envoyé par diogene Voir le message
    - Si TabTimePalAlim == NULL alors TabTimePalAlim[i] est illégal.

    De plus :

    - La réallocation peut échouer et, dans ce cas, TabTimePalAlim est placé à NULL et la mémoire anciennement allouée n'est plus accessible et perdue.
    Ranger le résultat du realloc dans un pointeur intermédiaire et si il est différent de NULL, le recopier dans TabTimePalAlim. On conserve alors, en cas d'échec, l'accès à la mémoire précédemment allouée via TabTimePalAlim.

    - Le premier realloc change le nombre de pointeurs sur int.
    Si ce nombre de pointeurs est plus petit qu'avant, les pointeurs sur int en excédent sont perdus et il est impossible de récupérer la mémoire sur laquelle il pointe
    Si ce nombre est plus grand qu'avant, les nouveaux pointeurs ne sont pas initialisés. On doit faire (éventuellement, si le nombre d'éléments a changé) une realloc sur les anciens TabTimePalAlim[i] (avec les mêmes précautions) et une allocation sur les nouveaux.
    Ok, c'est vrai que ce n'est pas logique pour la réallocation. Je n'avais pas vu cette erreur. Je vous remercie. je vais modifier et voir ce que cela donne.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 74
    Par défaut
    J'ai modifié mon code pour la réallocation. Il y avait plusieurs erreurs à force de modifier. Voici le code pour la réallocation d'un des tableau 2D:

    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
    temp=realloc(TabTimePalAlim, NbAlim*sizeof(int*)); //réallocation 1ere D
    	 for(i=0; i<NbAlim; i++)
    		 temp[i]=realloc(TabTimePalAlim[i], NbPal*sizeof(int));  //réallocation 2eme D
     
    	 if(temp[i] == NULL)
    	             {
    	             for(i=0; i<NbPal; i++)
    		    {
    		    free(TabTimePalAlim[i]);
    		    TabTimePalAlim[i]=NULL;
    		    }
    		free(TabTimePalAlim);
    		TabTimePalAlim=NULL;
    		}
     
    		 else
    		     {
    		     TabTimePalAlim=temp;
    		     for(i=0; i<NbAlim; i++)
    			 TabTimePalAlim[i]=temp[i];
    		     }
    Lors de l'exxecution, encore une erreur:
    "Run Time error
    Pointer arithmetic involving pointer to freed memory"

    Qu'est ce qui ne va pas dans mon code?

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par totoscill Voir le message
    Bonjour,

    Je veux allouer de la mémoire dynamiquement pour 4 tableaux à 2 dimensions mais lors de l'éxécution, le test m'informe que l'allocation est impossible. Je programme sous labwindows CVI 8.5. Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TabTimePalAlim=(int**) calloc(5,sizeof(int*));
      for(i=0; i<NbAlim; i++)
       TabTimePalAlim[i]=(int*) calloc(5,sizeof(int)); 
     
      if(TabTimePalAlim[i]==NULL)
       {
       MessagePopup("Erreur!!!", "Erreur lors de l'allocation de mémoire!");
    La réponse en cette question tiens en un caractère.

    {

    Le test est censé être dans la boucle. Dons ton cas, tu testes TabTimePalAlim[i] à l'extérieur de la boucle (i == NbAlim dans ce cas).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  2. Allocation dynamique de mémoire : Limitations ?
    Par rulianf dans le forum C++
    Réponses: 5
    Dernier message: 22/03/2006, 17h03
  3. Allocation dynamique de mémoire
    Par cd090580 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 12/11/2005, 11h17
  4. [VC++/ASM] Allocation dynamique de mémoire ?
    Par Magus (Dave) dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 21/12/2004, 15h05
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

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