Bases de la programmation en C

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 ?

  1. ALa norme exige qu'il soit toujours détecté comme une erreur d'exécution : dans tout environnement, le programme affiche un message d'erreur et s'arrête
  2. BNULL est défini comme désignant l'adresse 0 : dans tout environnement, le contenu de l'adresse 0 est lu et le traitement continue
  3. CC'est un comportement indéfini : sous un système d'exploitation, le programme s'arrête en général anormalement, mais sur un microcontrôleur sans MMU l'adresse 0 peut être lisible et l'erreur passer inaperçue
Afficher la réponse et l'explication

Réponse : C. C'est un comportement indéfini : sous un système d'exploitation, le programme s'arrête en général anormalement, mais sur un microcontrôleur sans MMU l'adresse 0 peut être lisible et l'erreur passer inaperçue

Déréférencer un pointeur NULL est un comportement indéfini : la norme ne dit pas ce qui se passe. Linux et Windows n'attribuent aucune page autour de l'adresse 0 : un déréférencement provoque un défaut de page, et le programme se termine en général anormalement (par une erreur de segmentation sous Linux, par exemple). Sur un petit microcontrôleur sans MMU, l'adresse 0 peut contenir de la mémoire flash ou les vecteurs d'interruption et être lisible : l'erreur peut alors provoquer des dysfonctionnements sans jamais se manifester. Il est important de vérifier qu'un pointeur n'est pas NULL avant de l'utiliser.

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

Autres questions sur Bases de la programmation en C

  1. 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 ?
  2. 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 ?
  3. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui stocke 9 dans un champ de bits de 3 bits ?
  4. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise la macro SQUARE définie par #define ?
  5. Le fichier d'en-tête sensor.h est écrit comme ci-dessus. Quel est le rôle des trois lignes #ifndef, #define et #endif ?