NOM¶
malloc, free, calloc, realloc - Allocation et libération dynamiques de
  mémoire
SYNOPSIS¶
#include <stdlib.h>
 
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
DESCRIPTION¶
La fonction 
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é. Si 
size est nulle, 
malloc
  renvoie soit NULL ou un unique pointeur qui pourra être passé
  ultérieurement à 
free() avec succès.
La fonction 
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 s'il a
  déjà été libéré avec 
free(ptr), le
  comportement est indéterminé. Si 
ptr est NULL, aucune
  opération n'est effectuée.
La fonction 
calloc() alloue la mémoire nécessaire pour un
  tableau de 
nmemb éléments de 
size octets, et renvoie
  un pointeur vers la mémoire allouée. Cette zone est remplie avec des
  zéros. Si 
nmemb ou si 
size est nulle, 
calloc renvoie
  soit NULL ou un unique pointeur qui pourra être passé
  ultérieurement à 
free() avec succès.
La fonction 
realloc() modifie la taille du bloc de mémoire
  pointé par 
ptr à la taille de 
size octets. Le contenu
  de la mémoire entre la zone de départ et la plus petite taille entre
  la nouvelle et l'ancienne taille n'est pas modifié. Si la nouvelle taille
  est plus grande que l'ancienne taille, le contenu de la zone de mémoire
  nouvellement allouée n'est pas initialisé. Si 
ptr est NULL,
  l'appel est équivalent à 
malloc(size), pour toute valeur de
  
size ; si 
size vaut zéro et 
ptr est non NULL,
  l'appel est équivalent à 
free(ptr). Si 
ptr est NULL,
  il doit avoir été obtenu par un appel antérieur à
  
malloc(), 
calloc() ou 
realloc(). Si la zone pointée
  était déplacée, un 
free(ptr) est effectué.
VALEUR RENVOYÉE¶
Les fonctions 
malloc() et 
calloc() renvoient un pointeur vers la
  mémoire allouée, qui est correctement alignée pour n'importe
  quel type de variable. Si elles échouent, elles renvoient NULL. NULL peut
  également être renvoyé par un appel réussi à
  
malloc() avec un paramètre 
size égal à zéro,
  ou par un appel réussi de 
calloc() avec 
nmemb ou
  
size égal à zéro.
La fonction 
free() ne renvoie pas de valeur.
La fonction 
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. Si 
size vaut zéro, realloc
  renvoie NULL ou un pointeur acceptable pour 
free(). Si 
realloc()
  échoue, le bloc mémoire original reste intact, il n'est ni
  libéré ni déplacé.
C89, C99.
NOTES¶
Par défaut, Linux suit une stratégie d'allocation optimiste. Ceci
  signifie que lorsque 
malloc() renvoie une valeur non NULL, il n'y a
  aucune garantie que la mémoire soit véritablement disponible. Dans
  le cas où le système manque de mémoire, un ou plusieurs
  processus seront tués par l'infâme « OOM
  killer » (gestionnaire de mémoire). Pour plus d'informations,
  consultez la description de 
/proc/sys/vm/overcommit_memory et
  
/proc/sys/vm/oom_adj dans 
proc(5), ainsi que le fichier
  
Documentation/vm/overcommit-accounting des sources du noyau Linux.
 
En général, 
malloc() alloue la mémoire depuis le tas, et
  ajuste la taille du tas en conséquence avec 
sbrk(2). Lorsque les
  bloques de mémoire alloués sont plus larges que
  
MMAP_THRESHOLD octets, l'implémentation de la glibc de
  
malloc alloue la mémoire selon un projection anonyme privée
  avec 
mmap(2). 
MMAP_THRESHOLD vaut 128 Ko par défaut et
  il est ajustable avec 
mallopt(3). Les allocations réalisées
  avec 
mmap(2) ne sont pas affectées par la limitation de ressource
  
RLIMIT_DATA (consultez 
getrlimit(2)).
 
Pour éviter les corruptions d'applications multithreadées, les mutex
  sont utilisés en interne pour protéger les structures de
  données de gestion de mémoire utilisées dans ces fonctions.
  Dans une application multithreadée où les threads allouent et
  libèrent la mémoire en même temps, ces mutex risquent d'entrer
  en conflit. Pour gérer l'allocation de mémoire de façon
  évolutive dans les applications multithreadées, la glibc crée
  des 
domaines d'allocation mémoire si un conflit de mutex
  est détecté. Chaque domaine est un grand espace de mémoire qui
  est alloué en interne par le système (en utilisant 
brk(2) ou
  
mmap(2)), et géré avec ses propres mutex.
 
Le standard UNIX 98 nécessite que 
malloc(), 
calloc() et
  
realloc() positionnent 
errno à 
ENOMEM en cas
  d'échec. La glibc suppose qu'il en est ainsi (et les versions glibc de
  ces routines 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 échoue durant un appel à 
malloc(),
  
calloc(), 
realloc() ou 
free(), ceci est presque toujours
  le signe d'une corruption du tas. 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 dernières versions de libc Linux (depuis 5.4.23) et de glibc (2.x)
  contiennent une implémentation de 
malloc() qui est personnalisable
  à l'aide des variables d'environnement. Pour plus de précisions,
  consultez 
mallopt(3).
VOIR AUSSI¶
brk(2), 
mmap(2), 
alloca(3), 
malloc_get_state(3),
  
malloc_info(3), 
malloc_trim(3), 
malloc_usable_size(3),
  
mallopt(3), 
mcheck(3), 
mtrace(3),
  
posix_memalign(3)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet 
man-pages Linux.
  Une description du projet et des instructions pour signaler des anomalies
  peuvent être trouvées à l'adresse
  <
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
  <
http://po4a.alioth.debian.org/> par l'équipe de traduction
  francophone au sein du projet perkamon
  <
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
  Portal <
http://manpagesfr.free.fr/> (2003-2006). Florentin Duneau et
  l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
  <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
  paquet 
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
  en utilisant la commande «  
man -L C
  <section>  <page_de_man> ».