Allocation mémoire

Les zones mémoire d'un processus, l'allocation statique, automatique et dynamique, malloc, calloc, realloc, free et sizeof en C, et les quatre fautes classiques : fuite, double libération, utilisation après libération et dépassement de tampon.

  • 26 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Zones mémoire d'un processus : de quoi s'agit-il ?

    Voir la réponse

    Découpage de l'espace d'adressage d'un programme en zones : le code, les données (globales et static), le tas et la pile.

    Chaque zone donne sa durée de vie : une donnée globale ou static dure toute l'exécution, une variable de pile le temps de l'appel de sa fonction, un bloc du tas jusqu'à son free.

  • Ce code doit ranger n entiers de type int. Quelle est la faute ?

    ```c
    int *t = malloc(n);
    `

    • Il réserve n octets : il faut n * sizeof(int)
    • Il manque le cast (int *) devant malloc
    • Le pointeur t devrait être déclaré de type char *
    • Il faut passer par calloc, malloc ne sert qu'aux chaînes
    Voir la réponse

    Il réserve n octets : il faut n * sizeof(int)

    malloc compte en octets. Avec 4 octets par int, n octets ne contiennent que n / 4 entiers : écrire les suivants déborde du bloc. En C, le cast du résultat de malloc est inutile, car un void * se convertit tout seul.

  • Les blocs obtenus par malloc vivent sur le …, alors que les variables locales d'une fonction vivent sur la ….

    Voir la réponse

    Les blocs obtenus par malloc vivent sur le tas, alors que les variables locales d'une fonction vivent sur la pile.

    La pile se vide toute seule au retour de la fonction ; le tas ne se vide que par des appels explicites à free.

  • Allocation dynamique : de quoi s'agit-il ?

    Voir la réponse

    Réservation d'un bloc de mémoire pendant l'exécution, dont la taille peut dépendre de données connues seulement à ce moment-là.

    Le bloc est pris sur le tas et reste à toi jusqu'à ce que tu le rendes avec free : ni la fin d'une fonction ni la fin d'un bloc ne le rendent.

  • Un serveur écrit en C voit sa consommation de mémoire grimper de quelques kilo-octets à chaque requête, sans jamais redescendre, jusqu'à être tué. Quelle est la cause la plus probable ?

    • La pile déborde car les requêtes s'empilent trop vite les unes sur les autres
    • Les variables globales sont recopiées à chaque requête
    • Le compilateur a mal calculé la taille des variables locales
    • Un bloc alloué par requête n'est jamais rendu avec free
    Voir la réponse

    Un bloc alloué par requête n'est jamais rendu avec free

    Une croissance lente et continue du tas est le signe d'une fuite. Un débordement de pile se produit d'un coup, par récursion ou gros tableau local, pas requête après requête.