Allocation dynamique
Plan
Allocation dynamique
1/5
Allocation dynamique
malloc et free
Ces fonctions nécessitent l’inclusion de l’entête stdlib.h et
manipulent un segment de mémoire — appelé le tas — associé au
processus.
Fonction d’allocation dynamique de mémoire :
• fonction malloc de la librairie standard ;
• réserve un espace mémoire dans le tas du processus ;
• void *malloc(size t size)
réserve size octets dans le tas et retourne un pointeur sur la
zone allouée (NULL en cas d’echec).
Fonction de désallocation de mémoire ;
• fonction free de la librairie standard ;
• void free(void *ptr)
libère une zone allouée par un précédent malloc.
ptr doit obligatoirement être un pointeur retourné par un
précédent malloc.
2/5
Allocation dynamique
Conversion de type
Petit rappel sur le forçage de type : coercition (cast)
• force la conversion de type de la valeur d’un expression :
( type ) expression
• ne peut être une valeur gauche.
Petit rappel sur la taille d’un objet : opérateur sizeof
• sizeof(identificateur de type)
donne la taille en octets de tout objet de type
identificateur de type ;
3/5
Allocation dynamique
Conversion de type
Petit rappel sur le forçage de type : coercition (cast)
• force la conversion de type de la valeur d’un expression :
( type ) expression
• ne peut être une valeur gauche.
Petit rappel sur la taille d’un objet : opérateur sizeof
• Avec beaucoup de précaution, on peut utiliser
sizeof (expression)
qui donne la taille en octets de son opérande expression.
sizeof(expression) est équivalent à
sizeof(type de l’expression) :
void foo ( char * ptr / * ou c h a r p t r [ ] * / ) { 1
putdec ( sizeof ( ptr ) ) ; / * e q u i v : s i z e o f ( c h a r * ) * / 2
} 3
int main ( void ) { 4
char txt [ 3 2 ] = ” Bonjour ! ” ; 5
putdec ( sizeof ( txt ) ) ; / * e q u i v : s i z e o f ( c h a r [ 3 2 ] ) ; * /6
foo ( txt ) ; 7
} 8 4/5
Allocation dynamique
Exemple lors de l’allocation dynamique :
# include < s t d l i b . h> 1
struct point { int x , y ; } ; 2
3
struct point * reserve_n_points ( int n ) { 4
return 5
( struct point * ) 6
malloc ( n * sizeof ( struct point ) ) ; 7
} 8
9
int main ( void ) { 10
struct point * p_point = reserve_n_points ( 1 0 ) ; 11
return 0 ; 12
} 13
Attention : l’espace mémoire alloué dynamiquement sur — le tas
— dans une fonction n’est pas détruit en fin de fonction comme
l’espace associé à une variable automatique (locale).
5/5