Retour Suite Index

9.5.3. La fonction malloc et l'opérateur sizeof

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

Remarque avancée

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