malloc(3)

Fonction de la bibliothèque C

Réserve un bloc de mémoire sur le tas et renvoie son adresse, ou NULL si l'allocation échoue. Le contenu n'est pas initialisé, et le bloc est à toi jusqu'à free.

Synopsis
#include <stdlib.h>
void *malloc(size_t size);

Description

malloc demande au système size octets contigus sur le tas et renvoie l'adresse du premier. Le bloc vit jusqu'à ce que tu le rendes avec free(3), indépendamment de la fonction qui l'a créé : c'est ce qui distingue le tas de la pile, où une variable disparaît à la fin de son bloc. La norme C23 (ISO/IEC 9899, édition 2024) le dit sans détour : la représentation du bloc est indéterminée. Autrement dit, les octets que tu récupères contiennent n'importe quoi, souvent les restes d'une allocation précédente. Si tu as besoin d'une zone mise à zéro, prends calloc(3).

Le type de retour est void *, compatible avec n'importe quel type de pointeur sans conversion explicite en C. Écris int *t = malloc(n * sizeof(int));, pas de cast.

Valeur de retour

L'adresse du bloc en cas de succès, NULL en cas d'échec. Teste toujours ce retour avant de déréférencer le pointeur : écrire dans un pointeur NULL déclenche un segmentation fault. L'échec arrive quand il n'y a plus de mémoire, mais aussi, sous Linux, bien après que malloc a renvoyé une adresse : le noyau sur-engage la mémoire par défaut, donc un bloc énorme peut sembler alloué puis faire tuer le processus au moment où tu l'écris vraiment.

malloc(0) est un cas limite : la norme autorise soit NULL, soit un pointeur unique que tu peux passer à free mais pas déréférencer. Ne construis rien dessus.

Exemple

scores.c
#include <stdio.h>#include <stdlib.h>
int main(void){    int *scores = malloc(3 * sizeof(int));
    if (scores == NULL)        return 1;    for (int i = 0; i < 3; i++)        scores[i] = (i + 1) * 10;    printf("%d %d %d\n", scores[0], scores[1], scores[2]);    free(scores);    return 0;}
Terminal
$ gcc -Wall -Wextra -g scores.c -o scores$ ./scores10 20 30

Pièges

  • Ne pas tester NULL : le premier accès plante au lieu de signaler proprement le manque de mémoire.

  • Calculer la taille avec n * sizeof(type) sans se méfier du débordement. Quand n vient de l'extérieur, le produit peut déborder size_t et tu alloues trop peu. calloc fait cette vérification pour toi.

  • Oublier le free correspondant : chaque malloc a exactement un free, sinon la mémoire fuit. Un rapport Valgrind le montre.

  • Perdre le seul pointeur vers le bloc (le réaffecter, sortir de la fonction sans le rendre) : le bloc existe encore mais plus personne ne peut le libérer.

À toi d'écrire le code.