histoires de malloc et de structures

histoires de malloc et de structures - C - Programmation

Marsh Posté le 06-04-2005 à 16:09:28    

bonjour
j'essaie de faire marcher un truc , en fait je dois allouer dynamiquement un gros tableau qui se trouve dans une structure, mais le truc plante lorsque je libere la memoire
a terme il faut que je passe un pointeur vers la structure a une fonction pour qu'elle traite les donn'es  du tableau
voila  le principal sous visual :  
 
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
 
 
typedef struct IMAGE {
 
 unsigned char  **val; //val[x][y]
 
} image;
 
 
 
 
int main()
{
 
 
 image  im;    
 int   x=0,
    n=5000;
 
 
   
 if ((im.val = (unsigned char**) malloc (sizeof(unsigned char) * n)) == NULL)  
  printf ("\nechec !\n" );  
 
 
 
 for (x = 0 ; x < n ; x = x + 1)
 {  
 
  if ((im.val[x] = (unsigned char*) malloc (n * sizeof(unsigned char))) == NULL)      
   printf ("ERREUR allocation" );
     
   
 }
 printf ("allocation : x=%i\r", x);
 printf ("\n destruction..." );
 
 
 for (x=0 ; x<n; x=x+1){
 
    printf ("f  %i\r", x);
   free (im.val[x]);
 
 }
         free (im.val);
 
}
donc voila si quelqu'un a une idée pour faire fonctionner tout ça, mercii !!

Reply

Marsh Posté le 06-04-2005 à 16:09:28   

Reply

Marsh Posté le 06-04-2005 à 16:11:32    

guanglier a écrit :


#include <iostream.h>


Pas du C (et du mauvais C++...)
 
Plutôt que de mettre des cast aussi compliqués qu'inutiles, il vaut mieux utiliser des méthodes simples et fiables :
 
http://mapage.noos.fr/emdel/notes.htm#malloc


#include <stdio.h>
#include <stdlib.h>
 
typedef struct IMAGE
{
   unsigned char **val;         //val[x][y]
}
image;
 
int main (void)
{
   image im;
 
#if 1
   size_t n = 5000;
#else
   size_t n = 5;
#endif
   /* creer le tableau de pointeur */
   im.val = malloc (sizeof *im.val * n);
 
   if (im.val != NULL)
   {
      {
         size_t x;
 
         for (x = 0; x < n; x = x + 1)
         {
            im.val[x] = malloc (n * sizeof *im.val[x]);
 
            if (im.val[x] == NULL)
            {
               printf ("ERREUR allocation\n" );
               break;
            }
 
            printf ("allocation : x=%i\r", x);
            fflush (stdout);
         }
      }
      printf ("\n" );
 
      {
         size_t x;
         for (x = 0; x < n; x = x + 1)
         {
 
            printf ("destruction : x=%i\r", x);
            fflush (stdout);
            free (im.val[x]);
 
         }
      }
      free (im.val);
   }
   else
   {
      printf ("Memory error\n" );
   }
   printf ("\n" );
   return 0;
}


Pousse des cris si tu ne comprends pas...


Message édité par Emmanuel Delahaye le 06-04-2005 à 16:28:21

---------------
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 06-04-2005 à 16:14:57    

en effet, jle met tjrs mais il ne sert pas la ....
des restes du c++
 
mais bon tu vois pkoi ça marche po , enfin pkoi ça plante ? car je trouve ça bon les def du tableau et le free !

Reply

Marsh Posté le 06-04-2005 à 16:27:17    

Ton premier malloc n'est pas assez grand... Tu alloues un tableau d'(unsigned char) alors qu'il te faut un tableau d'(unsigned char *).

Reply

Marsh Posté le 06-04-2005 à 16:28:13    

c'est ton premier malloc, il devrait allouer des pointeurs et non des char.
 
ps : 40Ko c'est pas un gros tableau
 

Reply

Marsh Posté le 06-04-2005 à 16:28:33    

oups grillé :)


Message édité par fra0 le 06-04-2005 à 16:32:53
Reply

Marsh Posté le 06-04-2005 à 16:35:01    

oula alors allons y par etape :  
-----------------
#if 1  
   size_t n = 5000;  
#else  
   size_t n = 5;  
#endif  
---------------
la je pousse un cri j'ai pas compris
 
 
matafan :  
if ((im.val = (unsigned char**) malloc (sizeof(unsigned char) * n)) == NULL)  
pour le premier malloc ct po bon ? ct po du tableau de char ?
 
 
fra0:
c'est ton premier malloc, il devrait allouer des pointeurs et non des char.
 
aaaaaaaaaaa je viens de comprendre ! ! ! !
lol quelle revelation ! !
merci tout le monde, je vais modifier mes trucs !  
sinon Emmanuel ya tjrs des trcus obscures pour moi dans ton code !
 
merci

Reply

Marsh Posté le 06-04-2005 à 16:45:24    

guanglier a écrit :

oula alors allons y par etape :  
-----------------
#if 1  
   size_t n = 5000;  
#else  
   size_t n = 5;  
#endif  
---------------
la je pousse un cri j'ai pas compris


Avant de tester avec une matrice de 5000x5000, j'ai passé le code au détécteur de mensonge avec une matrice de 5x5, histoire de valider le principe...

Citation :

sinon Emmanuel ya tjrs des trcus obscures pour moi dans ton code !


Si te ne dis pas quoi, on va pas avancer..


Message édité par Emmanuel Delahaye le 06-04-2005 à 16:52:54

---------------
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 06-04-2005 à 16:48:34    

oué en fait c'etait juste pour ça ..
donc oui tu as change la taille pour voir ce que ça donne !
okayyy
 
sinon pour la "im.val[x] = malloc (n * sizeof *im.val[x]);"  
pas besoin de parentheses pour le sizeof donc , je note
 
 
fflush (stdout);  
j'y pensai pas mais oui il se pourrait que ce soit important !!
 
 
merci pour tout en tout cas!  :jap:

Reply

Sujets relatifs:

Leave a Replay

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