Bonjour,

Dans un projet, je dois manipuler des matrices dans F_2 (c'est-a-dire il n'y a que des zeros ou des 1). Je créer ma structure de la facon suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 
typedef struct matrix{
  unsigned char nb_row;
  unsigned char nb_col;
  unsigned char nb_uc;
  unsigned char **tab;
} matrix;
ou nb_row est le nombre de ligne, nb_col le nombre de colonne, tab ma matrice a proprement parlé, et nb_uc le nombre de unsigned char. car je n'utilise pas un octet pour stocker un bit un octet stok huit bits.
C'est a dire une matrice 8x8 va contenir 8 unsigned char.


Maintenant je creer un createur et un destructeur de ma structure

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
 
 
 
matrix *create(unsigned char row, unsigned char column)
{
  unsigned char i, j, nb_uc;
  matrix *retour;
 
 
  nb_uc  = (unsigned char) ceil((float)row/8);
 
  assert((retour = malloc(sizeof(matrix))) != NULL);
  assert((retour->tab = malloc(sizeof(unsigned char*)*nb_uc)) != NULL);
 
  for(i=0; i<nb_uc; i++)
    {
      assert(((retour->tab)[i] = malloc(sizeof(unsigned char)*column)) != NULL);
      for(j=0; j<column; j++)
	{
	  (retour->tab)[i][j] = 0;
	}
    }
 
  retour->nb_row = row;
  retour->nb_col = column;
  retour->nb_uc  = nb_uc;
  return(retour);
}
 
 
 
 
 
void destroy(matrix **A)
{
  unsigned char i;
 
  for(i=0; i<(*A)->nb_uc; i++)
    {
      free(((*A)->tab)[i]);
      ((*A)->tab)[i] = NULL;
    }
 
  free((*A)->tab);
  (*A)->tab = NULL;
 
  free(*A);
  (*A) = NULL;
}
et quand je passe a valgrind ce simple executable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
int main(void)
{
  matrix *A;
 
  A = create(4,4);
 
  destroy(&A);
 
  return(0);
}

il me sort

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 
==5221== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
==5221== malloc/free: in use at exit: 10,448 bytes in 1 blocks.
==5221== malloc/free: 4 allocs, 3 frees, 10,464 bytes allocated.
==5221== For counts of detected errors, rerun with: -v
==5221== searching for pointers to 1 not-freed blocks.
==5221== checked 78,172 bytes.
Si j'ai bien compris il dit qu'il n'y a pas de fuite mémoire mais pourtant il dénombre 4 allocations mais seulement 3 free...

Ce qui est bizar car si je fait le source a la main je ne compte pour creer une matrice 4x4 que 3 malloc(), d'ou sort ce quatrieme....


Qu'en pensez vous??


(Je veux bien admettre que je n'ai pas été clair, alors hesitez pas a me signaler si ca ne l'est pas!!)


Merci d'avance.