La fonction malloc de la bibliothèque <stdlib> nous aide à localiser et à réserver de la mémoire au cours d'un programme. Elle nous donne accès au tas (heap); c.-à-d. à l'espace en mémoire laissé libre une fois mis en place le DOS, les gestionnaires, les programmes résidents, le programme lui-même et la pile (stack).
La fonction malloc
malloc( <N> ) fournit l'adresse d'un bloc en mémoire de <N> octets libres ou la valeur zéro s'il n'y a pas assez de mémoire.
Attention !
Sur notre système, le paramètre <N> est du type unsigned int. A l'aide de malloc, nous ne pouvons donc pas réserver plus de 65535 octets à la fois!
Exemple
Supposons que nous ayons besoin d'un bloc en mémoire pour un texte de 4000 caractères. Nous disposons d'un pointeur T sur char (char *T). Alors l'instruction:
T = malloc(4000);fournit l'adresse d'un bloc de 4000 octets libres et l'affecte à T. S'il n'y a plus assez de mémoire, T obtient la valeur zéro.
Si nous voulons réserver de la mémoire pour des données d'un type dont la grandeur varie d'une machine à l'autre, nous avons besoin de la grandeur effective d'une donnée de ce type. L'opérateur sizeof nous aide alors à préserver la portabilité du programme.
L'opérateur unaire sizeof
sizeof <var> fournit la grandeur de la variable <var> sizeof <const> fournit la grandeur de la constante <const> sizeof (<type>) fournit la grandeur pour un objet du type <type>
Exemple
Après la déclaration,
short A[10]; char B[5][10];nous obtenons les résultats suivants sur un IBM-PC (ou compatible):
sizeof A |
s'évalue à 20 |
|
sizeof B |
s'évalue à 50 |
|
sizeof 4.25 |
s'évalue à 8 |
|
sizeof "Bonjour !" |
s'évalue à 10 |
|
sizeof(float) |
s'évalue à 4 |
|
sizeof(double) |
s'évalue à 8 |
Exemple
Nous voulons réserver de la mémoire pour X valeurs du type int; la valeur de X est lue au clavier:
int X; int *PNum; printf("Introduire le nombre de valeurs :"); scanf("%d", &X); PNum = malloc(X*sizeof(int));
exit
S'il n'y a pas assez de mémoire pour effectuer une action avec succès, il est conseillé d'interrompre l'exécution du programme à l'aide de la commande exit (de <stdlib>) et de renvoyer une valeur différente de zéro comme code d'erreur du programme (voir aussi chapitre 10.4).
Exemple
Le programme à la page suivante lit 10 phrases au clavier, recherche des blocs de mémoire libres assez grands pour la mémorisation et passe les adresses aux composantes du tableau TEXTE[]. S'il n'y a pas assez de mémoire pour une chaîne, le programme affiche un message d'erreur et interrompt le programme avec le code d'erreur -1.
Nous devons utiliser une variable d'aide INTRO comme zone intermédiaire (non dynamique). Pour cette raison, la longueur maximale d'une phrase est fixée à 500 caractères.
#include <stdio.h> #include <stdlib.h> #include <string.h> main() { /* Déclarations */ char INTRO[500]; char *TEXTE[10]; int I; /* Traitement */ for (I=0; I<10; I++) { gets(INTRO); /* Réservation de la mémoire */ TEXTE[I] = malloc(strlen(INTRO)+1); /* S'il y a assez de mémoire, ... */ if (TEXTE[I]) /* copier la phrase à l'adresse */ /* fournie par malloc, ... */ strcpy(TEXTE[I], INTRO); else { /* sinon quitter le programme */ /* après un message d'erreur. */ printf("ERREUR: Pas assez de mémoire \n"); exit(-1); } } return 0; }Retour Suite Index