Bonjour,

J'ai vu en cours les fonctions malloc() et free(), ainsi que le concept de tableau à taille dynamique.

1) Ce code permet d'augmenter la taille du tableau de 10 postes supplémentaires à chaque appel de la fonction agrandir (aucune valeur n'est manipulée dans le tableau mais le principe est là).
Ma façon de procéder est-elle correcte ?

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
#include <stdlib.h>
#include <stdio.h>
 
 
int* agrandir(int tab[], int *taille)
{
	int *t_temp = NULL;
	int i = 0;
 
	t_temp = (int*) malloc(sizeof (int) * (*taille + 10));
	/* on recopie les valeurs dans le nouveau tableau */
	for (i=0; i < *taille; i++)
	{
		t_temp[i] = tab[i];
	}
 
	*taille += 10;
	free(tab);
 
	/* on retourne la nouvelle adresse de tab */
	return t_temp;
}
 
 
int main()
{
	int *tab = NULL;
	int taille=0;
 
	tab = (int*) malloc(sizeof (int) * 50);
	taille = 50;
 
	printf("nombre de postes : %d\n", taille);
 
	tab = agrandir(tab, &taille);
	printf("nombre de postes : %d\n", taille);
	free(tab);
 
	return 0;
}
2) Je me suis un peu documenté (man malloc et FAQ C) et j'ai vu la fonction realloc, qui m'a l'air de faire la même chose.
Est-ce le cas ?

3) J'ai aussi une question sur le fonctionnement de la fonction free :
Quand on déclare un tableau à dimension fixe
tableau est de type int[50] donc le langage sait que 50 postes int sont réservés en mémoire à partir de l'adresse de tableau.
Mais si on veut une taille dynamique, tableau est déclaré avec :
donc le type est int*, alors comment fait la fonction free pour libérer la mémoire si la taille n'est stockée nulle part ?
Mes professeurs m'ont dit que c'est parce que la mémoire vive possède une zone "différente" qui est réservée aux allocations dynamiques... mais je ne vois pas le rapport.
Comment free connaît le nombre de postes à libérer à partir de l'adresse qui lui est passée en argument ?


Merci