MALLOC(3) Manuel du programmeur Linux MALLOC(3)
NOM
malloc, calloc, free, realloc - Allocation et libération dynamiques de
mémoire.
SYNOPSIS
#include <stdlib.h>
void *calloc (size_t nmemb, size_t size);
void *malloc (size_t size);
void free (void *ptr);
void *realloc (void *ptr, size_t size);
DESCRIPTION
calloc() alloue la mémoire nécessaire pour un tableau nmemb éléments,
chacun d'eux représentant size octets, et renvoie un pointeur vers la
mémoire allouée. Cette zone est remplie avec des zéros.
malloc() alloue size octets, et renvoie un pointeur sur la mémoire
allouée. Le contenu de la zone de mémoire n'est pas initialisé.
free() libère l'espace mémoire pointé par ptr, qui a été obtenu lors
d'un appel antérieur à malloc(), calloc() ou realloc(). Si le pointeur
ptr n'a pas été obtenu par l'un de ces appels, ou si il a déjà été
libéré avec free(), le comportement est indéterminé. Si ptr est NULL,
aucune tentative de libération n'a lieu.
realloc() modifie la taille du bloc de mémoire pointé par ptr pour
l'amener à une taille de size octets. realloc() conserve le contenu de
la zone mémoire minimum entre la nouvelle et l'ancienne taille. Le con-
tenu de la zone de mémoire nouvellement allouée n'est pas initialisé.
Si ptr est NULL, l'appel de realloc() est équivalent à malloc(size).
Si size vaut zéro, l'appel est équivalent à free(ptr). Si ptr n'est
pas NULL, il doit avoir été obtenu par un appel antérieur à malloc(),
calloc() ou realloc().
VALEUR RENVOYÉE
Pour calloc() et malloc(), la valeur renvoyée est un pointeur sur la
mémoire allouée, qui est correctement alignée pour n'importe quel type
de variable, ou NULL si la demande échoue.
free() ne renvoie pas de valeur.
realloc() renvoie un pointeur sur la mémoire nouvellement allouée, qui
est correctement alignée pour n'importe quel type de variable, et qui
peut être différent de ptr, ou NULL si la demande échoue, ou si size
vaut zéro. Si realloc() échoue, le bloc mémoire original reste intact,
il n'est ni libéré ni déplacé.
CONFORMITÉ
ANSI-C
VOIR AUSSI
brk(2)
NOTES
Le standard Unix98 réclame que malloc(), calloc(), et realloc() posi-
tionne errno à ENOMEM en cas d'échec. La Glibc suppose qu'il en est
ainsi (et les versions glibc de cette routine le font). Si vous
utilisez une implémentation personnelle de malloc qui ne positionne pas
errno, certaines routines de bibliothèques peuvent échouer sans donner
de raison dans errno.
Lorsqu'un programme se plante durant un appel à malloc(), calloc() ou
realloc(), ceci est presque toujours le signe d'une corruption du tas
(zone de mémoire dans laquelle sont allouées les variables dynamiques).
Ceci survient généralement en cas de débordement d'un bloc mémoire
alloué, ou en libérant deux fois le même pointeur.
Les versions récentes de la bibliothèque C de Linux (libc postérieures
à 5.4.23) et la bibliothèque GNU libc 2.x incluent une implémentation
de malloc() dont on peut configurer le comportement à l'aide de vari-
ables d'environnement. Quand la variable MALLOC_CHECK_ existe, les
appels à malloc() emploient une implémentation spéciale, moins efficace
mais plus tolérante à l'encontre des bugs simples comme le double appel
de free() avec le même argument, ou un débordement de buffer d'un seul
octet (bugs de surpassement d'une unité, ou oubli d'un caractère nul
final d'une chaîne). Il n'est toutefois pas possible de pallier toutes
les erreurs de ce type, et l'on risque de voir des fuites de mémoire se
produire.
Si la variable MALLOC_CHECK_ vaut zéro, toutes les corruptions du tas
détectées sont ignorées silencieusement; Si elle vaut 1 un message de
diagnostique est affiché sur stderr. Si cette variable vaut 2, la fonc-
tion abort() est appelée immédiatement. Ce comportement est partic-
ulièrement utile car un crash pourrait sinon se produire ultérieure-
ment, et serait très difficile à diagnostiquer.
TRADUCTION
Christophe Blaess, 1997.
GNU 9 Avril 1999 MALLOC(3)
|