parce que une allocation c'est la réserve d'un bloc contigu de mémoire. Donc, si tu n'en fais qu'une, quelle que soit la manière dont tu t'en sers, tu n'as besoin que d'une seule libération.
Schématiquement, toi tu alloues ceci :
1 2 3
|
|-------------------------------------|----------------|
x a |
Ensuite, que tu découpes x en 3, 10, 100, 10000 parties, que tu le considères comme un tableau à 1, 2, 3, 10 dimensions, c'est pareil : quand tu veux libérer, c'est l'ensemble de la zone gauche. Et comme tu l'as reservé en une fois, tu la libères en 1...
Donc quand tu fais :
x=malloc(n*m*sizeof(float));
c'est exactement équivalent à faire :
x=malloc(N*sizeof(float));
car ce qui pour toi est un tableau dont TOI tu vas te servir à 2 dimensions, toi ou quelqu'un d'autre peut s'en servir à une...
Maintenant, pour faire ce que tes potes te disent pour la libération, il aurait fallu fabriquer des tableaux à 2 dimensions, comme ceci :
1 2 3 4 5 6 7 8
|
float **x ;
int i , n, m ;
x = malloc ( n * sizeof(float *) );
for ( i = 0 ; i < n ; i++ )
x[i] = malloc ( m*sizeof(float) ); |
Et ça tu le libérerais en faisant ;
1 2 3 4 5
|
for ( i = 0 ; i < n ; i++ )
free(x[i] ;
free(x); |
Partager