Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. malloc
malloc 👆 Click Here! Read More..
Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Calloc)
Page d’aide sur l’homonymie

Pour l’article ayant un titre homophone, voir Mallock.

Par exemple, l'appel malloc(4) alloue 4 octets dans le tas mémoire et renvoie l'adresse du premier octet (sur l'image 0x42).
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article ne cite pas suffisamment ses sources (juillet 2024).

Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ».

En pratique : Quelles sources sont attendues ? Comment ajouter mes sources ?

En informatique, la fonction malloc[1] (pour memory allocation en anglais) est une fonction de la bibliothèque standard du langage C, qui permet d'allouer dynamiquement de la mémoire. La libération de la mémoire ainsi réservée s'effectue avec la fonction free[2].

Cette fonction est déclarée dans l'en-tête <stdlib.h>[1]. Dans les systèmes GNU/Linux, elle fait partie du paquet GNU C Library.

Utilisation

[modifier | modifier le code]

La fonction malloc permet de réserver une zone de la mémoire[3]. Son prototype est le suivant :

void *malloc(size_t nbOctets);

Le seul paramètre à passer à malloc est le nombre d'octets à allouer. La valeur renvoyée est l'adresse du premier octet de la zone mémoire allouée. Si l'allocation n'a pu se réaliser (par manque de mémoire libre), la valeur de retour est la constante NULL[4].

La libération de la mémoire précédemment allouée via malloc est assurée par la fonction free dont la déclaration est la suivante[3] :

void free(void *ptr);

Le seul paramètre à passer est l'adresse du premier octet de la zone allouée et aucune valeur n'est retournée une fois cette opération réalisée.

Voici du code réservant 20 octets et le libérant immédiatement après si l'allocation a été effectuée.

#include <stdlib.h>

char * pointeur = malloc(20 * sizeof(char)); //Allocation de 20 octets (Un char est égal à 1 octet)
if(pointeur == NULL)
{
    printf("L'allocation n'a pu être réalisée\n");
}
else
{
    printf("L'allocation a été un succès\n");
    free(pointeur); //Libération des 20 octets précédemment alloués
    pointeur = NULL; // Invalidation du pointeur
}

Motivation

[modifier | modifier le code]
Article détaillé : Allocation de mémoire.

Il existe trois types d'allocation de mémoire pour une variable dans un programme C : l'allocation statique, automatique, et dynamique. La fonction malloc concerne l'allocation dynamique.

L'allocation statique a lieu au cours de la compilation par la déclaration de variables statiques. Ces variables là persistent durant toute l'exécution du programme. Cela concerne les variables globales et les variables locales déclarées en utilisant le mot-clé static. L'allocation statique oblige le développeur à connaître à l'avance la quantité de mémoire qui sera utilisée par le programme. C'est ainsi qu'un « gaspillage » de la mémoire peut survenir si l'on réserve trop de mémoire par rapport à ce dont le programme a véritablement besoin pour réaliser la tâche qui lui incombe.

L'allocation automatique a lieu pendant l'exécution du programme sur la pile d'exécution. Il s'agit des variables locales déclarées dans un bloc d'instructions. La libération de la mémoire n'est réalisée qu'à la fin du bloc d'instructions dans lequel est déclarée la variable. Cela peut également être un facteur de gaspillage lorsque de la mémoire est allouée, mais n'est plus utilisée.

C'est ici que l'allocation dynamique de mémoire entre en jeu. La réservation de la mémoire se fait au cours de l'exécution du programme, mais la libération de cette mémoire n'est plus gérée par le compilateur, mais par le programmeur. L'allocation dynamique a lieu à la demande sur le tas. Pour cela, on utilise des fonctions d'allocation de la mémoire comme malloc. Cela augmente la complexité du programme, mais la gestion de la mémoire est plus fine. Si un programme alloue de la mémoire par malloc sans la libérer ensuite par free, on parle de fuite de mémoire. Pour éviter ce type de bug et faciliter l'écriture des programmes, certains langages disposent d'un mécanisme de ramasse-miettes, mais ce n'est pas le cas du langage C.

Fonctions analogues

[modifier | modifier le code]

calloc

[modifier | modifier le code]

La zone mémoire allouée par malloc n'est pas initialisée automatiquement. Cette initialisation peut être réalisée à l'aide de la fonction memset[5] ou bien par le parcours de toute la zone mémoire. Avec la fonction calloc, cette phase d'initialisation n'est plus nécessaire, car la zone mémoire allouée est initialisée avec des 0[3].

La déclaration de calloc[6] est la suivante :

void *calloc(size_t nmemb, size_t size);

Le paramètre nmemb est le nombre d'éléments que l'on désire réserver et size correspond à la taille en octets d'un élément. La valeur retournée est la même que pour malloc.

realloc

[modifier | modifier le code]

La fonction realloc permet de modifier la taille de la mémoire allouée préalablement avec malloc[3]. S'il est nécessaire de déplacer la zone mémoire, car il n'y a pas assez de mémoire contiguë, la libération de l'ancienne zone mémoire est réalisée par realloc via free.

La déclaration de realloc[7] est la suivante :

void *realloc(void *ptr, size_t size);

Le paramètre ptr désigne le début de la zone mémoire dont on désire modifier la taille. Le second paramètre, size, est la nouvelle taille en octet de la zone mémoire.

Si la fonction réussit, la valeur retournée est le début de la zone mémoire allouée. Attention : la valeur du pointeur ptr n'est plus valide car la nouvelle zone peut débuter à un autre endroit de la mémoire si un déplacement a été nécessaire.

Si la fonction échoue, elle retourne la valeur NULL. Des précautions doivent être prises pour éviter une fuite de mémoire. Il convient de veiller à ce que l'adresse de l'ancien bloc ne soit pas écrasée avant de s'assurer que la réallocation a bien réussi. Dans le code suivant, le test sur la valeur de tampon n'est pas suffisant. Si realloc échoue, l'adresse de la zone mémoire est perdue :

tampon = realloc(tampon, nouvelle_taille);
if (tampon == NULL)
    rapporterErreur();

Pour remédier à ce problème, on introduit une nouvelle variable tmpqui stocke le résultat de realloc sans écraser la valeur de tampon :

tmp = realloc(tampon, nouvelle_taille);
if (tmp == NULL)
  {
    free(tampon);
    rapporterErreur();
  }
else
  tampon = tmp;

Débogage

[modifier | modifier le code]

Débogage sous Windows

[modifier | modifier le code]

Des utilitaires graphiques permettent de vérifier que la mémoire utilisée est bien libérée lorsqu'elle n'est plus utilisée, comme c'est le cas avec MFC Debugging support qui est dédié à l'API MFC de Microsoft[8].

Débogage sous GNU/Linux

[modifier | modifier le code]
  • La GNU C Library fournit un couple de programme en Perl et fonction C nommés mtrace[9],[10], la fonction C génére des traces relatives aux allocations mémoire dans un programme et le programme permet de les analyser et afficher de maniére lisible pour un humain;
  • TotalView, Valgrind et mpatrol : débogueurs permettant de détecter les fuites de mémoire et les écritures hors de la zone allouée par malloc ;
  • La bibliothèque logicielle DUMA aide à détecter indirectement les malloc ayant une taille trop petite ou trop grande ;

Notes et références

[modifier | modifier le code]
  1. ↑ a et b (en) « malloc(3p) » Accès libre, sur man7.org, 2017 (consulté le 19 avril 2025)
  2. ↑ (en) « free(3p) » Accès libre, sur man7.org, 2017 (consulté le 19 avril 2025)
  3. ↑ a b c et d « L'allocation dynamique : Malloc et consoeurs », sur https://zestedesavoir.com, 25 août 2024 à 20h42 (consulté le 7 aout 2025)
  4. ↑ Steven Gellis, Maitriser les pointeurs en C : Découvrez les principes de base et les méthodes avancées des pointeurs en C, France, Amazon, 168 p. (ISBN 9798884353541), p. 30
  5. ↑ (en) « memset(3p) » Accès libre, sur man7.org, 2017 (consulté le 19 avril 2025)
  6. ↑ (en) « calloc(3p) » Accès libre, sur man7.org, 2017 (consulté le 19 avril 2025)
  7. ↑ (en) « realloc(3p) » Accès libre, sur man7.org, 2017 (consulté le 19 avril 2025)
  8. ↑ (en) « MFC Debugging Support », Microsoft (consulté le 22 septembre 2007)
  9. ↑ (en) « mtrace(1) » Accès libre, sur man7.org, 25 novembre 2024 (consulté le 19 avril 2025)
  10. ↑ (en) « mtrace(3) » Accès libre, sur man7.org, 23 juillet 2024 (consulté le 19 avril 2025)
v · m
Éléments de programmation informatique
Bibliothèque logicielle
  • Bibliothèque standard
  • Espace de noms
  • Framework
  • Gabarit
  • Interface
  • Interface de programmation (API)
Vocabulaire
  • Algorithme
  • Expression
  • Indentation
  • Instruction
  • Ligne de code
  • Opérateur
  • Pseudo-code
  • Ramasse-miettes
Fonctions
  • Dispatch multiple
  • Factorisation
  • Fonction imbriquée
  • Fonction de rappel
  • Fonction d'ordre supérieur
  • Fonction récursive
  • Généricité
  • Opérande
  • Paramètre
  • Polymorphisme
  • Procédure
  • Signature de type
  • Surcharge
Objet
  • Classe
  • Constructeur
  • Destructeur
  • Encapsulation
  • Héritage
  • Héritage multiple
  • Instance
  • Méthode
Événementiel Inversion de contrôle
Code source
Structures de données
  • Arbre
  • Enregistrement
  • Ensemble
  • File
  • Liste
  • Liste chaînée
  • Pile
  • Sémaphore
  • Tableau
  • Tas
  • Type abstrait
  • Vecteur
Déclarations
  • Affectation
  • Convention de nommage
  • Pointeur
  • Portée
  • Référence
  • Tableau associatif
  • Type énuméré
  • Type récursif
  • Typage statique
  • Variable
  • Variable globale
  • Variable locale
Structures de contrôle
  • Case
  • Eval
  • For
  • Goto
  • Switch
  • While
Fonctions usuelles
  • Concaténation
  • Incrémentation
  • malloc
  • printf
Outil de développement
  • Environnement de développement
  • Générateur de documentation
  • Gestion de versions
  • Modèle
  • Patch
  • Spécification
Folklore
  • Hello world
  • Principe KISS
  • Langage de programmation exotique
Catégories :
  • Programmation informatique
  • Développement logiciel
  • icône décorative Portail de la programmation informatique
Ce document provient de « https://fr.wikipedia.org/w/index.php?title=Malloc&oldid=229928498 ».
Catégories :
  • Bibliothèque standard du C
  • Mémoire informatique
Catégories cachées :
  • Article manquant de références depuis juillet 2024
  • Article manquant de références/Liste complète
  • Portail:Programmation informatique/Articles liés
  • Portail:Informatique/Articles liés

  • indonesia
  • Polski
  • الرية
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • مصر
  • Nederlands
  • 本語
  • Português
  • Sinugboanong Binisaya
  • Svenska
  • Українска
  • Tiếng Việt
  • Winaray
  • 中文
  • Русски
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id