Bases de la programmation en C

int *make(void) {
    int x = 42;
    return &x;
}

Quelle affirmation sur le pointeur renvoyé par la fonction make ci-dessus est correcte ?

  1. Ax reste au même endroit jusqu'à la fin du programme : on peut toujours lire 42 sans risque par le pointeur renvoyé
  2. Bx est déplacé dans le tas au retour : l'appelant doit le libérer par free après usage
  3. CLa durée de vie de x se termine au retour de la fonction : le pointeur renvoyé désigne un emplacement invalide, et l'utiliser est un comportement indéfini
Afficher la réponse et l'explication

Réponse : C. La durée de vie de x se termine au retour de la fonction : le pointeur renvoyé désigne un emplacement invalide, et l'utiliser est un comportement indéfini

x est une variable locale sans static (une variable automatique) : sa durée de vie se termine au retour de la fonction, et l'emplacement qu'elle occupait sur la pile est réutilisé par d'autres appels de fonction. Un pointeur qui désigne une zone dont la durée de vie est terminée s'appelle un pointeur pendant, et lire ou écrire à travers lui est un comportement indéfini. gcc donne un avertissement pour ce code et peut même générer un code qui renvoie NULL. On renvoie plutôt la valeur elle-même, ou l'on utilise une zone préparée par l'appelant ou allouée par malloc.

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

Autres questions sur Bases de la programmation en C

  1. En C, quelle est la raison la plus appropriée pour laquelle il est recommandé d'écrire p = NULL; juste après free(p); ?
  2. La chaîne de 8 caractères "ABCDEFGH" est passée à la fonction save ci-dessus. Que se passe-t-il ?
  3. 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 ?
  4. 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 ?
  5. 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 ?