Bases de la programmation en C

int process(int n) {
    int *buf = malloc(n * sizeof(int));
    if (buf == NULL) return -1;
    if (fill(buf, n) != 0)
        return -2;
    use(buf, n);
    free(buf);
    return 0;
}

fill et use sont des fonctions définies ailleurs. Quel est le problème de la fonction ci-dessus ?

  1. ALorsque fill renvoie une valeur non nulle, la fonction retourne sans libérer buf, si bien que la zone allouée n'est jamais libérée
  2. BLa valeur de retour de malloc n'est pas vérifiée, si bien qu'un pointeur NULL est déréférencé en cas d'échec de l'allocation
  3. Cbuf est utilisé après free, si bien qu'une zone libérée est accédée
Afficher la réponse et l'explication

Réponse : A. Lorsque fill renvoie une valeur non nulle, la fonction retourne sans libérer buf, si bien que la zone allouée n'est jamais libérée

Une zone allouée par malloc subsiste jusqu'à sa libération par free. Sur le chemin où fill échoue et où la fonction sort par return -2, free n'est pas appelé et la valeur (l'adresse) de buf est perdue : cette zone ne pourra plus jamais être libérée. C'est ce qu'on appelle une fuite de mémoire ; si la fonction est appelée de façon répétée, la mémoire utilisable ne cesse de diminuer, ce qui pose surtout problème pour les équipements embarqués et les serveurs qui fonctionnent longtemps. On appelle free(buf) avant de retourner, ou on regroupe la libération en un seul endroit, à la fin de la fonction.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. Quelle affirmation sur le pointeur renvoyé par la fonction make ci-dessus est correcte ?
  2. En C, quelle est la raison la plus appropriée pour laquelle il est recommandé d'écrire p = NULL; juste après free(p); ?
  3. La chaîne de 8 caractères "ABCDEFGH" est passée à la fonction save ci-dessus. Que se passe-t-il ?
  4. En C, quelle description de ce qui se passe lorsqu'un pointeur NULL est déréférencé (lecture de *p alors que p vaut NULL) est correcte ?
  5. On considère un environnement courant où char fait 1 octet et int 4 octets, et où les int sont placés à des adresses multiples de 4. Quelle est la sortie obtenue en exécutant le code ci-dessus ?