malloc puis free....

malloc puis free.... - C - Programmation

Marsh Posté le 09-04-2005 à 03:04:12    

voila, g un petit problème de malloc.
je veux faire un tableau à 3D dans une fonction:
 
 

Code :
  1. int j,k;
  2.   int ***Zd;
  3.   Zd=malloc(n*sizeof(int));
  4.   for (j=0;j<n;j++)
  5.       {
  6.       Zd[j]=malloc(n*sizeof(int));
  7.       for (k=0;k<1;k++)
  8.           {
  9.           Zd[j][k]=malloc(n*sizeof(int));           
  10.           }
  11.       }
  12.   return(Zd);


 
cette fonction ira dans le main
mais je n'arrive pas à trouver de solution pour libérer la mémoire à la fin, g essayé ça dans tous les sens:
 

Code :
  1. int ***Zd;
  2. int j,k;
  3. free(Zd[j][k]);
  4. free(Zd[j]);
  5. free(Zd);


 
ça compile, mais ça plante!
 
sans les free, ça plante pas.
 
 
j'utilise dev c++, mais je dois utiliser le .c dans une vieille station linux...
 
quelqu'un aurait une solution? merci  :jap:


---------------
Ma vie en Polonie: http://ketchupnchantilly.blogspot.com/
Reply

Marsh Posté le 09-04-2005 à 03:04:12   

Reply

Marsh Posté le 09-04-2005 à 05:13:14    

Tu n'alloues pas la bonne taille. Quel est le type de Zd ? quel est le type de Zd[j] ? En pratique ce n'est pas ça qui pose problème car sur ton architecture les int ont probablement la même taille que les pointeurs... Mais c'est faux.
 
Ensuite, ton tableau fait apparemment n par n par n. Or ta boucle sur k vas de 0 à 0... Si tu libère de 0 à n (ce qu'on ne peut pas savoir puisque tu n'a pas posté le code des free), forcément ça va planter.


Message édité par matafan le 09-04-2005 à 05:13:37
Reply

Marsh Posté le 09-04-2005 à 06:33:38    

Salut,
 
Avec ton code :

Code :
  1. int ***Zd;
  2. int j,k;
  3. free(Zd[j][k]);
  4. free(Zd[j]);
  5. free(Zd);


Tu ne libères pas tes tableaux. Si on part du principe que j=k=n alors tu essayes de désallouer quelque chose qui ne t'appartient pas (ton tableau occupe [0->(n-1)][0->(n-1)][0->(n-1)]. De plus en faisant ça tu ne libérerais que 3*n éléments.
 
Essayes ça :

Code :
  1. int ***Zd;
  2. int j,k;
  3. for( j=0; j<n; ++j )
  4. {
  5.    for( k=0; k<n; ++k )
  6.    {
  7.       free(Zd[j][k]);
  8.    }
  9.    free(Zd[j]);
  10. }
  11. free(Zd);


Message édité par IrmatDen le 09-04-2005 à 07:03:50
Reply

Marsh Posté le 09-04-2005 à 08:41:30    

Biroute a écrit :


je veux faire un tableau à 3D dans une fonction:
<...>
ça compile, mais ça plante!
 
quelqu'un aurait une solution? merci


Essayer de comprendre ce qu'est un pointeur ? Qu'est-ce qui a guidé ton choix lorsque tu écris:


  int ***Zd;
  Zd=malloc(n*sizeof(int));


Tu crois sincèrement qu'un pointeur a la taille d'un int ou t'as simplement oublié de secouer ton neurone avant de t'en servir ?
 
http://mapage.noos.fr/emdel/notes.htm#pointeurs
http://mapage.noos.fr/emdel/notes.htm#malloc
 


#include <stdio.h>
#include <stdlib.h>
 
void m3_delete (int ***const Zd, size_t const n)
{
   size_t i;
 
   for (i = 0; i < n; i++)
   {
      size_t j;
 
      for (j = 0; j < n; j++)
      {
         free (Zd[i][j]), Zd[i][j] = NULL;
      }
      free (Zd[i]), Zd[i] = NULL;
   }
   free (Zd);
}
 
int ***m3_create (size_t const n)
{
   /* allocate the arrays of pointers (x) */
   int ***Zd = malloc (n * sizeof *Zd);
 
   if (Zd != NULL)
   {
      size_t i;
 
      /* clean the array of pointers (x) */
      for (i = 0; i < n; i++)
      {
         Zd[i] = NULL;
      }
 
      for (i = 0; Zd != NULL && i < n; i++)
      {
         /* allocate the arrays of pointers (y) */
         Zd[i] = malloc (n * sizeof *Zd[i]);
 
         if (Zd[i] != NULL)
         {
            size_t j;
 
            /* clean the array of pointers (y) */
            for (j = 0; j < n; j++)
            {
               Zd[i][j] = NULL;
            }
 
            for (j = 0; j < n; j++)
            {
               Zd[i][j] = malloc (n * sizeof *Zd[i][j]);
 
               if (Zd[i][j] != NULL)
               {
                  size_t k;
 
                  /* fill the data with its linear index */
                  for (k = 0; k < n; k++)
                  {
                     Zd[i][j][k] = (n * n * i) + (n * j) + k;
                  }
               }
               else
               {
                  m3_delete (Zd, n), Zd = NULL;
                  break;
               }
            }
         }
         else
         {
            m3_delete (Zd, n), Zd = NULL;
         }
      }
   }
   return Zd;
}
 
void m3_print (int **const *const Zd, size_t const n)
{
   size_t i;
 
   for (i = 0; i < n; i++)
   {
      size_t j;
 
      for (j = 0; j < n; j++)
      {
         size_t k;
         printf ("[" );
         for (k = 0; k < n; k++)
         {
            printf ("%3d ", Zd[i][j][k]);
         }
         printf ("]\n" );
      }
      printf ("\n" );
   }
}
 
int main (void)
{
   size_t const n = 4;
   int ***m = m3_create (n);
 
   if (m != NULL)
   {
      m3_print (m, n);
      m3_delete (m, n), m = NULL;
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 09-04-2005 à 09:20:50

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-04-2005 à 10:26:11    

faut pas faire les exo Emmanuel

Reply

Marsh Posté le 09-04-2005 à 12:33:24    

Taz a écrit :

faut pas faire les exo Emmanuel


Quel exo ? Je ne vois qu'un carré blanc...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed