Bases de la programmation en C

En C, quelle est la raison la plus appropriée pour laquelle il est recommandé d'écrire p = NULL; juste après free(p); ?

  1. ASans l'affectation de NULL, la zone libérée ne redevient pas disponible, ce qui provoque une fuite de mémoire
  2. Bp continue de désigner la zone libérée : cela évite les doubles libérations et les utilisations après libération, et les rend plus faciles à détecter
  3. Cfree met automatiquement p à NULL, mais on réécrit la même valeur par précaution, pour vérifier
Afficher la réponse et l'explication

Réponse : B. p continue de désigner la zone libérée : cela évite les doubles libérations et les utilisations après libération, et les rend plus faciles à détecter

free(p) libère la zone que désignait p, mais la valeur (l'adresse) de la variable p reste inchangée. Lire ou écrire *p ensuite est une utilisation après libération (use after free), et rappeler free(p) est une double libération (double free) ; les deux sont des comportements indéfinis, qui peuvent corrompre les informations de gestion du tas et faire apparaître une anomalie loin de la cause. Si p reçoit NULL, la double libération est sans danger, puisque free(NULL) est défini comme ne faisant rien, et une vérification de NULL avant usage révèle aussi l'erreur. Les autres pointeurs qui désignent la même zone demandent toutefois une attention séparée.

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

Autres questions sur Bases de la programmation en C

  1. La chaîne de 8 caractères "ABCDEFGH" est passée à la fonction save ci-dessus. Que se passe-t-il ?
  2. 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 ?
  3. 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 ?
  4. uint32_t et uint8_t sont des types entiers non signés de 32 bits et de 8 bits, et l'environnement est petit-boutiste (little-endian). 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 stocke 9 dans un champ de bits de 3 bits ?