malloc
Table des matières
Retour à l'index
NOM
malloc, free, calloc, realloc, reallocarray — Allocation et libération de
mémoire dynamique
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <stdlib.h>
void *malloc(size_t taille);
void free(void *_Nullable ptr);
void *calloc(size_t nmemb, size_t taille);
void *realloc(void *_Nullable ptr, size_t taille);
void *reallocarray(void *_Nullable ptr, size_t nmemb, size_t size);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
reallocarray() :
Depuis la glibc 2.29 :
_DEFAULT_SOURCE
glibc 2.28 et précédentes :
_GNU_SOURCE
DESCRIPTION
malloc()
La fonction malloc() alloue taille octets et renvoie un pointeur sur
la mémoire allouée. Le contenu de la zone de mémoire n'est pas initialisé. Si taille est nulle, malloc renvoie une valeur de
pointeur unique qui pourra être passée ultérieurement à free() avec
succès (consulter « Comportement non portable » pour les problèmes de
portabilité).
free()
La fonction free() libère l'espace mémoire pointé par ptr qui doit
avoir été obtenu lors d'un appel antérieur à malloc() ou une fonction de
la même famille. Autrement, ou si ptr a déjà été libéré, le comportement
est indéterminé. Si ptr est NULL, aucune opération n'est effectuée.
calloc()
La fonction calloc() alloue de la mémoire pour un tableau de nmemb
éléments de taille taille octets chacun et renvoie un pointeur sur la
mémoire allouée. La zone mémoire est initialisée à 0. Si nmemb ou
taille vaut 0, calloc() renvoie alors une valeur de pointeur unique
qui pourra être passée ultérieurement à free() avec succès.
Si la multiplication de nmemb par taille provoque un dépassement
d'entier, calloc() renvoie une erreur. Par contre, aucun dépassement
d'entier ne serait détecté lors de l'appel suivant à malloc(), avec pour
conséquence l'allocation d'un bloc de mémoire incorrectement dimensionné :
malloc(nmemb * taille);
realloc()
La fonction realloc() modifie la taille du bloc de mémoire pointé par
ptr à taille octets. Le contenu de la mémoire entre la zone de départ
et le minimum des ancienne et nouvelle tailles 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 égal à NULL, l'appel est équivalent à malloc(taille) pour
toutes les valeurs de taille.
Si taille est égale à zéro et si ptr est différent de NULL, l'appel
est équivalent à free(ptr) (consulter cependant « Comportement non
portable » pour les problèmes de portabilité).
Excepté le cas où ptr est égal à NULL, il doit avoir été renvoyé par un
appel précédent à malloc ou à une fonction de la même famille. Si la zone
pointée a été déplacée, l'appel free(ptr) est effectué.
reallocarray()
La fonction reallocarray() déplace éventuellement le bloc mémoire pointé
par ptr et change sa taille pour qu'il soit suffisamment grand pour
contenir un tableau de nmemb éléments faisant chacun taille
octets. Elle équivaut à l'appel
realloc(ptr, nmemb * taille);
Cependant, contrairement à cet appel de realloc(), reallocarray()
échoue sans danger dans le cas où la multiplication entraînerait un
dépassement. Si un tel dépassement se produit, reallocarray() renvoie une
erreur.
VALEUR RENVOYÉE
Les fonctions malloc(), calloc(), realloc() et reallocarray()
renvoient un pointeur vers la mémoire allouée qui est correctement alignée
pour n'importe quel type dont la taille correspondra à la taille demandée ou
sera inférieure à cette dernière. Si elles échouent, elles renvoient NULL et
définissent errno pour indiquer l'erreur. Essayer d'allouer plus que
PTRDIFF_MAX octets est considéré comme une erreur, car un objet de cette
taille pourrait provoquer un dépassement lors d'une soustraction de pointeur
ultérieure.
La fonction free() ne renvoie aucune valeur et préserve errno.
Les fonction realloc() et reallocarray() renvoient NULL si ptr est
différent de NULL et si la taille demandée est égale à zéro, ce qui n'est
pas considéré comme une erreur (consulter « Comportement non portable » pour
les problèmes de portabilité). Dans le cas contraire, le pointeur renvoyé
peut être identique à ptr si la zone mémoire n'a pas été déplacée (par
exemple s'il y a assez de place pour l'étendre à son emplacement), ou peut
être différent de ptr si la zone mémoire a été déplacée à une nouvelle
adresse. Si ces fonctions échouent, le bloc mémoire originel reste intact ;
il n'est ni libéré ni déplacé.
ERREURS
calloc(), malloc(), realloc() et reallocarray() peuvent échouer
avec l'erreur suivante :
- ENOMEM
-
Plus de mémoire. Il est possible que l'application ait atteint les limites
RLIMIT_AS ou RLIMIT_DATA décrites dans getrlimit(2). Une autre
raison pourrait être que le nombre de mappages créés par le processus
appelant dépasse la limite spécifiée par /proc/sys/vm/max_map_count.
ATTRIBUTS
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
| Interface | Attribut | Valeur
|
|
malloc(),
free(),
calloc(),
realloc()
| Sécurité des threads | MT-Safe
|
STANDARDS
- malloc()
-
free()
calloc()
realloc()
C11, POSIX.1-2008.
- reallocarray()
-
Aucun.
HISTORIQUE
- malloc()
-
free()
calloc()
realloc()
POSIX.1-2001, C89.
- reallocarray()
-
glibc 2.26. OpenBSD 5.6, FreeBSD 11.0.
Depuis la glibc 2.30, malloc() et les fonctions de la même famille
refusent les tailles supérieures à PTRDIFF_MAX.
Depuis la glibc 2.33, free() préserve errno.
NOTES
Par défaut, Linux suit une stratégie d'allocation optimiste. Cela signifie
que lorsque malloc() ne renvoie pas NULL, il n'y a aucune garantie que la
mémoire soit véritablement disponible. S'il devait s'avérer que le système
manque de mémoire, un ou plusieurs processus seraient 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.rst 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 blocs 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 une projection anonyme privée avec
mmap(2). MMAP_THRESHOLD vaut 128 ko par défaut et il est ajustable
avec mallopt(3). Avant Linux 4.7, les allocations réalisées avec
mmap(2) n’étaient pas affectées par la limitation de ressource
RLIMIT_DATA ; depuis Linux 4.7, cette limite est aussi prise en compte
pour les allocations faites avec mmap(2).
Pour éviter les corruptions d'applications multithread, 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 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, 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.
Si votre programme utilise un allocateur de mémoire privé, il doit le faire
en remplaçant malloc(), free(), calloc() et realloc(). Les
fonctions de remplacement doivent implémenter les comportements de la glibc
documentés, y compris la gestion de errno, les allocations de taille
nulle et la surveillance des dépassements ; si ce n'est pas le cas, d'autres
routines de la bibliothèque pourront se planter ou fonctionner de manière
incorrecte. Par exemple, si la fonction qui remplace free() ne préserve
pas errno, des routines de la bibliothèque apparemment sans rapport
pourront échouer sans indiquer de raison valable dans errno. Un
allocateur de mémoire privé devra peut-être aussi remplacer d'autres
fonctions de la glibc ; consulter « Remplacer malloc » dans le manuel de la
glibc pour plus de détails.
L'échec d'un allocateur de mémoire est presque toujours le signe d'une
corruption du tas, à l'instar d'un débordement de bloc mémoire alloué ou
d'une double libération du même pointeur.
L'implémentation de malloc() est personnalisable à l'aide des variables
d'environnement. Pour plus de précisions, consultez mallopt(3).
Comportement non portable
Le comportement de ces fonctions lorsque la taille demandée est égale à 0
est spécifique à la glibc ; d'autres implémentations peuvent renvoyer NULL
sans définir errno et les programmes POSIX portables doivent tenir compte
de ces comportements. Consultez realloc(3p).
La norme POSIX exige des allocateurs de mémoire qu'ils renseignent errno
en cas d'erreur. Ce n'est cependant pas le cas de la norme C, et les
applications portables vers des plateformes non-POSIX ne sont donc pas
tenues de se plier à cette contrainte.
Les programmes portables ne doivent pas utiliser d'allocateurs de mémoire
privés, car les normes C et POSIX ne permettent pas le remplacement des
fonctions malloc(), free(), calloc() et realloc().
EXEMPLES
#include <err.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MALLOCARRAY(n, type) ((type *) my_mallocarray(n, sizeof(type)))
#define MALLOC(type) MALLOCARRAY(1, type)
static inline void *my_mallocarray(size_t nmemb, size_t taille);
int
main(void)
{
char *p;
p = MALLOCARRAY(32, char);
if (p == NULL)
err(EXIT_FAILURE, "malloc");
strlcpy(p, "foo", 32);
puts(p);
}
static inline void *
my_mallocarray(size_t nmemb, size_t taille)
{
return reallocarray(NULL, nmemb, taille);
}
VOIR AUSSI
valgrind(1), 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)
Pour des détails sur l'implémentation de la bibliothèque GNU C, consulter
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>,
Grégoire Scano <gregoire.scano@malloc.fr>
et
Lucien Gentis <lucien.gentis@waika9.com>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- malloc()
-
- free()
-
- calloc()
-
- realloc()
-
- reallocarray()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- ATTRIBUTS
-
- STANDARDS
-
- HISTORIQUE
-
- NOTES
-
- Comportement non portable
-
- EXEMPLES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:13 GMT, September 19, 2025