code | commentaire |
/* prog14a.c */ |
Les fonctions d'allocation dynamique nécessitent la librairie
stdlib .La fonction malloc réserve l'espace en mémoire pour 10 entiers et
place l'adresse du premier élément de ce tableau dans la variable
T . On s'assure que cette allocation a bien été
réalisée en vérifiant que T est différent de NULL. Comme pour les
tableaux, il faudra s'assurer de rester dans les limites de l'espace alloué.
N.B. on programmera généralement une conséquence moins brutale que return(-1) si l'allocation a échoué.Remarque. A la place de la fonction malloc , on aurait pu utiliser la fonction calloc
à deux paramètres : T=calloc(10,sizeof(int)); free(T) libère la mémoire allouée pour le pointeur
T . A titre de précaution, on place la valeur NULL dans T.Remarque. Quand le programme se termine, toutes les allocations de mémoire de ce programme sont théoriquement libérées, mais il est toujours important d'éviter le risque de fuite de mémoire. |
exécution | commentaire |
→ ./executable14a
avant malloc T=0x0
|
|
code | commentaire |
/* prog14b.c */ |
Ici aussi, le travail sur le tableau d'entier n'est effectué que si
l'allocation a réussi, mais ce programme peut gérer un souci d'allocation. T et U sont des pointeurs sur des entiers, i est un entier : le compilateur associe * au nom de variable qui le suit.
Il aurait été bien évidemment plus lisible de séparer :
int *T,*U; int i; U prend la valeur de pointeur de T et donne donc
accès au même espace mémoire.
|
exécution | commentaire |
→ ./executable14b 0 1 2 3 4 5 6 7 8 9
|
|
code | commentaire |
/* prog14c.c */ |
La fonction realloc augmente l'espace alloué à un pointeur.
N.B. Cette réallocation se fait soit en agrandissant l'espace réservé pour le pointeur, soit en réservant un nouvel espace plus grand où les anciennes données sont transférées. |
exécution | commentaire |
→ ./executable14c
0 1 2 3 4
|
Les cinq valeurs de la première allocation ont bien été conservées par la réallocation. |
code | commentaire |
/* prog14d.c */ |
On peut allouer un espace mémoire pour un type structuré. La variable d conserve la date qui a été copiée à partir du
tableau T, même après que ce tableau ait été désalloué.N.B. Par contre, après free(T);
T=NULL; une tentative d'accès à T[0] donnerait une erreur
(segmenttion fault).
|
exécution | commentaire |
→ ./executable14d
T[0]=31/12/1999
|
|
code | commentaire |
/* prog14e.c */
|
L'allocation d'un tableau à deux dimensions se fait en deux étapes, de
même que sa désallocation. Important. Ce programme ne gère pas les défauts d'allocation : – ni pour la première étape, où il faudrait ajouter un contrôle if (T==NULL) ...– ni pour la deuxième étape, où il faudrait ajouter des contrôles if (T[i]==NULL) ...
|
exécution | commentaire |
→ ./executable14e
0 1 2 3 4
|