Bases de la programmation en C

En C, quelle association des durées de vie de (1) une variable locale déclarée sans static dans une fonction, (2) une zone allouée par malloc et (3) une variable déclarée hors de toute fonction est correcte ?

  1. A(1) jusqu'à la fin du programme, (2) jusqu'au retour de la fonction qui l'a allouée, (3) jusqu'à la fin du programme
  2. B(1) jusqu'à la sortie du bloc où elle est déclarée, (2) jusqu'à sa libération par free, (3) jusqu'à la fin du programme
  3. C(1) jusqu'à la sortie du bloc où elle est déclarée, (2) jusqu'à la fin du programme (elle ne peut pas être libérée avant), (3) jusqu'au retour de la première fonction qui l'a utilisée
Afficher la réponse et l'explication

Réponse : B. (1) jusqu'à la sortie du bloc où elle est déclarée, (2) jusqu'à sa libération par free, (3) jusqu'à la fin du programme

La variable automatique (1) est en général placée sur la pile : elle est créée à l'entrée dans le bloc où elle est déclarée et disparaît à la sortie de ce bloc. La zone allouée par malloc (2) se trouve dans le tas : elle survit aux retours de fonction et reste utilisable jusqu'à sa libération par free. La variable (3), déclarée hors de toute fonction (comme toute variable déclarée static), existe pendant toute l'exécution du programme et se trouve dans une zone statique comme .data ou .bss. Utiliser un pointeur vers une zone dont la durée de vie est terminée, ou oublier free et laisser des zones s'accumuler, sont des causes d'erreurs fréquentes.

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

Autres questions sur Bases de la programmation en C

  1. int fait 32 bits (valeur maximale 2147483647). Quelle est la plus grande valeur de n pour laquelle la fonction fact(n) ci-dessus renvoie correctement la factorielle de n, sans dépassement de capacité ?
  2. int fait 4 octets et un pointeur 8 octets. Si la valeur (l'adresse) d'un pointeur sur int p est 0x1000, quelle est la valeur de p + 3 ?
  3. int fait 4 octets et un pointeur 8 octets. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
  4. int fait 4 octets. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  5. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui porte sur un tableau de char contenant une chaîne ?