ProgrammationDéveloppeur C

Expliquez la différence entre la pile et le tas en langage C et quand il est préférable d'utiliser l'un ou l'autre type de mémoire ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Dans le langage C, la mémoire pour les variables peut être allouée soit dans la pile (stack), soit dans le tas (heap).

  • Pile — alloue de la mémoire automatiquement lors de l'entrée dans la fonction et la libère lors de la sortie. C'est rapide, mais la quantité de mémoire est limitée à la taille de la pile (généralement quelques Mo).
  • Tas — alloue de la mémoire dynamiquement via malloc, calloc, realloc, et est libérée manuellement via free. La quantité de mémoire est limitée par les capacités du système, mais l'accès est plus lent et la libération est contrôlée manuellement.

Quand utiliser la pile :

  • Pour les variables locales, si leur taille est petite et connue au moment de la compilation.
  • Pour les arguments de fonction et les petits tableaux.

Quand utiliser le tas :

  • Lorsque la taille de la mémoire est inconnue à l'avance.
  • Pour des objets volumineux ou à long terme.

Exemple de code :

// Dans la pile int arr[10]; // Dans le tas int* parr = malloc(sizeof(int) * 10); // N'oubliez pas de libérer la mémoire free(parr);

Question piège.

Q : Que se passe-t-il si un tableau alloué via malloc n’a pas de fonction free appelée ?

_R : Une fuite de mémoire (memory leak) se produira. La mémoire allouée dynamiquement ne sera pas libérée automatiquement, et au fil du temps, cela peut entraîner l'épuisement de la mémoire de l'application ou du système entier.

Exemple de code :

void leak() { int* leakArr = malloc(100 * sizeof(int)); // Pas d'appel à free(leakArr), la mémoire est perdue }

Histoire

Dans un projet, les programmeurs allouaient de la mémoire pour une structure décrivant une session utilisateur via malloc, mais ont oublié d'appeler free à la fin du travail avec la session. En conséquence, le projet perdait de la mémoire pendant plusieurs jours, et le serveur "tombait" avec une erreur de manque de mémoire. Le problème n'a été résolu qu'après le profilage avec Valgrind et la correction de tous les free manquants.


Histoire

Un développeur a alloué un grand tableau (jusqu'à 10 Mo) dans la pile pour des calculs temporaires. Sur un serveur avec une petite taille de pile, cela entraînait un crash de l'application avec une erreur de débordement de pile (stack overflow). Après analyse, il a fallu transférer le tampon vers le tas.


Histoire

Un des développeurs a décidé de stocker de longues chaînes dans la pile, mais la taille de la chaîne était soumise à l'entrée de l'utilisateur. Lors de l'entrée d'une très longue chaîne, l'application plantait avec une erreur d'accès à la mémoire. En fin de compte, il a été décidé de transférer les données saisies dans le tas avec un contrôle de longueur.