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