Previous Next Up Index Contents

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;
}


Exercice 9.20

Ecrire un programme qui lit 10 phrases d'une longueur maximale de 200 caractères au clavier et qui les mémorise dans un tableau de pointeurs sur char en réservant dynamiquement l'emplacement en mémoire pour les chaînes. Ensuite, l'ordre des phrases est inversé en modifiant les pointeurs et le tableau résultant est affiché.


Previous Next Up Index Contents

Feedback - Copyright © 1993,1996,1997 F.Faber