© Éditions Eyrolles
197
chapitre n° 11
La gestion dynamique de la mémoire
L’appel :
malloc (50)
alloue un emplacement de 50 octets dans le tas et en fournit l’adresse en retour. Ici, cette
dernière est placée dans le pointeur adr.
L’instruction for qui vient à la suite n’est donnée qu’à titre d’exemple d’utilisation de la zone
ainsi créée.
b) Second exemple
long * adr ;
.....
adr = malloc (100 * sizeof(long)) ;
.....
for (i=0 ; i<100 ; i++) *(adr+i) = 1 ;
Cette fois, nous nous sommes alloué une zone de 100 * sizeof(long) octets (notez
l’emploi de sizeof qui assure la portabilité). Mais nous l’avons considérée comme une suite
de 100 entiers de type long. Pour ce faire, vous voyez que nous avons pris soin de placer le
résultat de malloc dans un pointeur sur des éléments de type long. N’oubliez pas que les
règles de l’arithmétique des pointeurs font que :
adr + i
correspond à l’adresse contenue dans adr, augmentée de sizeof(long) fois la valeur de i
(puisque adr pointe sur des objets de longueur sizeof(long)).
c) D’une manière générale
Le prototype de malloc (qui figure dans stdlib.h) est précisément :
void * malloc (size_t taille)
(stdlib.h)
Il montre tout d’abord que le résultat fourni par malloc est un pointeur générique (revoyez
éventuellement le paragraphe correspondant du chapitre relatif aux pointeurs). Il pourra donc
être converti implicitement en pointeur de n’importe quel type (c’est-à-dire sans qu’il soit
nécessaire de faire appel explicitement à l’opérateur de cast) ; ainsi, dans nos précédents
exemples, il a pu être converti en char * ou en long *. Une telle conversion peut apparaître
relativement fictive, dans la mesure où l’adresse correspondante n’est pas modifiée par la
conversion. Elle n’en a pas moins une grande importance puisque, comme nous l’avons déjà
mentionné à diverses reprises, la connaissance du type d’un pointeur intervient dans les
calculs arithmétiques portant sur ce pointeur.
D’autre part, nous constatons que l’unique argument de malloc est d’un type a priori inattendu (nous aurions pu penser à int ou long). En fait, size_t est un nom de type prédéfini
par typedef size_t est précisément défini dans le fichier stddef.h, mais vous n’avez pas
Delannoy Livre.book Page 197 Mercredi, 6. mai 2009 4:26 16
197
chapitre n° 11
La gestion dynamique de la mémoire
L’appel :
malloc (50)
alloue un emplacement de 50 octets dans le tas et en fournit l’adresse en retour. Ici, cette
dernière est placée dans le pointeur adr.
L’instruction for qui vient à la suite n’est donnée qu’à titre d’exemple d’utilisation de la zone
ainsi créée.
b) Second exemple
long * adr ;
.....
adr = malloc (100 * sizeof(long)) ;
.....
for (i=0 ; i<100 ; i++) *(adr+i) = 1 ;
Cette fois, nous nous sommes alloué une zone de 100 * sizeof(long) octets (notez
l’emploi de sizeof qui assure la portabilité). Mais nous l’avons considérée comme une suite
de 100 entiers de type long. Pour ce faire, vous voyez que nous avons pris soin de placer le
résultat de malloc dans un pointeur sur des éléments de type long. N’oubliez pas que les
règles de l’arithmétique des pointeurs font que :
adr + i
correspond à l’adresse contenue dans adr, augmentée de sizeof(long) fois la valeur de i
(puisque adr pointe sur des objets de longueur sizeof(long)).
c) D’une manière générale
Le prototype de malloc (qui figure dans stdlib.h) est précisément :
void * malloc (size_t taille)
(stdlib.h)
Il montre tout d’abord que le résultat fourni par malloc est un pointeur générique (revoyez
éventuellement le paragraphe correspondant du chapitre relatif aux pointeurs). Il pourra donc
être converti implicitement en pointeur de n’importe quel type (c’est-à-dire sans qu’il soit
nécessaire de faire appel explicitement à l’opérateur de cast) ; ainsi, dans nos précédents
exemples, il a pu être converti en char * ou en long *. Une telle conversion peut apparaître
relativement fictive, dans la mesure où l’adresse correspondante n’est pas modifiée par la
conversion. Elle n’en a pas moins une grande importance puisque, comme nous l’avons déjà
mentionné à diverses reprises, la connaissance du type d’un pointeur intervient dans les
calculs arithmétiques portant sur ce pointeur.
D’autre part, nous constatons que l’unique argument de malloc est d’un type a priori inattendu (nous aurions pu penser à int ou long). En fait, size_t est un nom de type prédéfini
par typedef size_t est précisément défini dans le fichier stddef.h, mais vous n’avez pas
Delannoy Livre.book Page 197 Mercredi, 6. mai 2009 4:26 16
