Problème allocation dynamique d'un tableau

Résolu
KiitKaate Messages postés 4 Statut Membre -  
KiitKaate Messages postés 4 Statut Membre -
Bonjour,

Je voudrais faire une grille (un tableau dynamique 2d), après plusieurs tentatives, et malgré valgrind je n'arrive pas à résoudre mon problème;
Je pense que le soucis viens soit des malloc soit de free

Voici mon code :

// structure grille : nombre de lignes, nombre de colonnes, tableau de tableau de cellules
typedef struct {int nbl; int nbc; int** cellules;} grille;

//fonction qui crée la grille
void alloue_grille (int l, int c, grille* g){
int i,j;
g->nbl=l;
g->nbc=c;
g->cellules=(int**)malloc(sizeof(int*)*l);
for(i=0; i<l;i++)
{g->cellules[i]=(int*)malloc(sizeof(int)*c);
for(j=0;j<c;j++)
set_morte(i,j,*g);
};
}

void libere_grille (grille* g){
int i;
int l;
g->nbl=l;
for (i=0; i<l; i++)
free(g->cellules[i]);

free(g->cellules);
g->cellules=NULL;
}


Merci d'avance pour votre aide,
Julie

3 réponses

  1. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    Bonjour,

    g->nbl=l; c'est plutôt l'inverse qu'il faut faire l=g->nbl;.
    0
    1. KiitKaate Messages postés 4 Statut Membre
       
      Merci, j'ai fait la modification, mais j'obtiens toujours une erreur de segmentation.

      Sur valgrind j'obtiens ceci:
      Conditional jump or move depends on uninitialised value(s)
      ==2709== at 0x4C2DB3C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
      ==2709== by 0x40146F: alloue_grille (grille.c:42) //erreur au niveau du 1er malloc
      ==2709== by 0x4012FD: init_grille_from_file (grille.c:18)
      ==2709== by 0x400899: main (main.c:21)

      in use at exit: 552 bytes in 1 blocks
      ==3101== total heap usage: 2 allocs, 1 frees, 4,648 bytes allocated
      0
  2. Utilisateur anonyme
     
    Il faut free(g) également

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct s_grille {
     int nbl;
     int nbc;
     int **cellules;
    } Grille;
    
    void alloue_grille (int l, int c, Grille *g);
    void libere_grille (Grille* g);
    int main(){
     
     int i,j,c=0;
    
     int line = 30, col = 50 ;
     Grille *g = malloc(sizeof(Grille));
     alloue_grille(line,col,g);
     
    
     //remplissage
     for(i = 0; i < line; i++){
      for( j = 0; j < col ; j++){
       g->cellules[j][i] = c++;
      }
     }
    
     //affichage
     for(i = 0; i < line; i++){
      for( j = 0; j < col ; j++){
       printf("%d  ", g->cellules[j][i]);
      }
      printf("\n");
     }
    
     libere_grille(g);
    
     return 0;
    }
    
    void alloue_grille (int l, int c, Grille *g){
    
     int i;
     g->nbl=l;
     g->nbc=c;
     g->cellules = (int**)malloc( c * sizeof(int*));
     for(i=0;i<c;i++) g->cellules[i] = (int*)calloc(l,sizeof(int*));
    }
    
    void libere_grille (Grille* g){
    
     int i;
     for(i=0;i<g->nbc;i++) free(g->cellules[i]);
     free(g->cellules);
     free(g);
    
    }


    ==7077== HEAP SUMMARY:
    ==7077== in use at exit: 0 bytes in 0 blocks
    ==7077== total heap usage: 53 allocs, 53 frees, 13,440 bytes allocated
    ==7077==
    ==7077== All heap blocks were freed -- no leaks are possible
    ==7077==


    edit: correction du code
    0
    1. KiitKaate Messages postés 4 Statut Membre
       
      Merci, j'ai remplacé les malloc par calloc et ça fonctionne
      0
  3. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    L'allocation et la libération de la grille elle-même n'est pas visible dans ce code.
    La fonction set_morte() reçoit la grille par copie, j'espère qu'elle est bien prototypée et qu'elle ne modifie pas la grille.
    0