Bases de la programmation en C
Apprenez le langage C avec des QCM qui demandent de suivre de courts extraits de code : taille des types entiers et types entiers de largeur fixe, promotion entière et conversions entre signé et non signé, priorité des opérateurs, opérations bit à bit, instruction switch, passage par valeur et pointeurs, variables static, tableaux et arithmétique des pointeurs, chaînes et sizeof, const, pointeurs de fonction, malloc, free et fuites de mémoire, pointeurs pendants, débordements de tampon, padding des structs, unions et endianness, champs de bits, macros et compilation conditionnelle, volatile et comportement indéfini.
Bases de la programmation en C : points clés
Le C reste très utilisé pour les logiciels proches du matériel, comme les systèmes d'exploitation, les pilotes de périphériques et le micrologiciel des microcontrôleurs. Il permet de manipuler directement les adresses mémoire et d'écrire du code rapide, mais il comporte aussi beaucoup de règles dont les erreurs passent facilement inaperçues si on ne les connaît pas : la taille d'un int varie selon l'implémentation, les types changent au milieu d'un calcul, et rien n'arrête un programme qui écrit au-delà de la fin d'un tableau.
Ce thème est centré sur des questions qui demandent de suivre la sortie de courts extraits de code réellement exécutés. Il couvre la taille des types entiers et les types entiers de largeur fixe de stdint.h, la division entière, la promotion entière et les comparaisons entre valeurs signées et non signées, la priorité des opérateurs, les opérations bit à bit, l'évaluation en court-circuit, le fall-through dans les instructions switch, le passage par valeur et le passage de pointeurs, les variables static et leur durée de vie, l'arithmétique des pointeurs et les tableaux, la disposition des tableaux à deux dimensions, les chaînes avec strlen et sizeof, la place de const et les pointeurs de fonction. Il traite ensuite de malloc et free, des fuites de mémoire, des pointeurs pendants, des débordements de tampon, des pointeurs NULL, du padding des structs, des unions et de l'endianness, des champs de bits, des macros et des gardes d'inclusion, de la compilation conditionnelle, de volatile en embarqué, ainsi que du comportement indéfini et de l'optimisation par le compilateur. La sortie des programmes a été vérifiée en compilant réellement le code avec gcc sous Linux sur x86-64. La trace de pseudo-code est traitée dans « Bases de la programmation (trace de pseudo-code) », les interruptions et l'accès aux registres avec volatile dans « Systèmes embarqués et firmware », le détail des optimisations du compilateur dans « Compilateurs », et l'organisation mémoire et l'édition de liens dans « Éditeurs de liens, chargeurs et exécutables ».
Toutes les questions sur Bases de la programmation en C (40)
- Que fixe la norme du langage C au sujet de la taille du type int ?
- Dans les programmes embarqués, une variable qui reçoit la valeur d'un registre de périphérique de 32 bits est souvent déclarée avec le type uint32_t de stdint.h plutôt qu'avec unsigned int. Quelle en est la raison principale ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, qui contient une division entre entiers ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise ++ en préfixe et en suffixe ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, où = est écrit dans la condition d'une instruction if ?
- Le code ci-dessus a été écrit pour tester si le bit 2 de la valeur de registre reg vaut 1. Quel est le résultat de son exécution ?
- uint8_t est un type entier non signé de 8 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
- uint8_t est un type entier non signé de 8 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui incrémente x 10 fois ?
- unsigned char fait 8 bits et int fait 32 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
- uint8_t est un type entier non signé de 8 bits et int fait 32 bits. Quel est le résultat de l'exécution du code ci-dessus ?
- int et unsigned int font 32 bits. Quel est le résultat de l'exécution du code ci-dessus ?
- unsigned int fait 32 bits. Quel est le comportement du code ci-dessus à l'exécution ?
- Un programme qui exécute « char c = 200; » puis affiche c avec %d dans printf affiche −56 lorsqu'il est compilé et exécuté avec gcc pour Linux sur x86-64, et 200 avec gcc pour Linux sur Arm. Quelle est la raison de cette différence ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, où b++ est écrit à droite de && et de || ?
- Quelle est la sortie obtenue en exécutant l'instruction switch ci-dessus, qui contient un case sans break ?
- Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
- Lorsque la fonction f ci-dessus est appelée trois fois de suite, quelle est la valeur de retour du troisième appel ?
- 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 ?
- 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é ?
- 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 ?
- int fait 4 octets et un pointeur 8 octets. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
- int fait 4 octets. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, qui porte sur un tableau de char contenant une chaîne ?
- Après les déclarations ci-dessus, on écrit l'une des instructions A « p = t; », B « *p = 'x'; », C « q = t; » ou D « *q = 'x'; ». Quelle combinaison indique celles qui provoquent une erreur de compilation ?
- Quelle est la sortie obtenue en exécutant le programme ci-dessus, qui utilise un tableau de pointeurs de fonction ?
- fill et use sont des fonctions définies ailleurs. Quel est le problème de la fonction ci-dessus ?
- Quelle affirmation sur le pointeur renvoyé par la fonction make ci-dessus est correcte ?
- En C, quelle est la raison la plus appropriée pour laquelle il est recommandé d'écrire p = NULL; juste après free(p); ?
- La chaîne de 8 caractères "ABCDEFGH" est passée à la fonction save ci-dessus. Que se passe-t-il ?
- 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 ?
- 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 ?
- 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 ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, qui stocke 9 dans un champ de bits de 3 bits ?
- Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise la macro SQUARE définie par #define ?
- 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 ?
- Quelle est la sortie obtenue lorsque le code ci-dessus est écrit dans la fonction main et exécuté ?
- Un registre de sortie de microcontrôleur est déclaré et utilisé comme ci-dessus. Quelle description de cette déclaration est correcte ?
- Quelle description du comportement indéfini, au sens de la norme du langage C, est correcte ?
- int et unsigned int font 32 bits. Laquelle des opérations suivantes est un comportement indéfini selon la norme du langage C ?
- Lorsque la fonction ci-dessus est compilée avec gcc en activant l'optimisation, le test if (p == NULL) peut être supprimé. Quelle en est la raison ?
Autres thèmes de Systèmes informatiques
- Arithmétique des ordinateurs IEEE 754, virgule fixe, erreur d'arrondi
- Probabilités, statistiques et files d'attente Dénombrement, lois de probabilité, estimation et tests, M/M/1
- ISA et assembleur RISC-V, modes d'adressage, conventions d'appel
- Compilateurs Analyse syntaxique, SSA, optimisation, registres
- Éditeurs de liens, chargeurs et exécutables ELF, symboles, relocalisation, liaison dynamique
- Système d'exploitation et matériel Interruptions, appels système, défauts de page
- Bases de Linux et de la ligne de commande Shell, permissions, pipes, scripts
- Hiérarchie mémoire Cache, remplacement, trois types de défauts
- Multicœur et synchronisation MESI, instructions atomiques, barrières mémoire
- Programmation GPU Warps, mémoire partagée, coalescence, occupation
- Pile matérielle et logicielle de l'IA Inférence/entraînement, quantification, roofline
- Bases de l'apprentissage automatique Types d'apprentissage, métriques et réseaux de neurones
- Systèmes embarqués et firmware GPIO, UART/SPI/I2C, RTOS
- HDL et vérification Verilog, latches, machines à états, testbenches
- Interfaces d'E/S et bus PCIe, USB, SerDes, CXL
- Bases des réseaux informatiques TCP/IP, sous-réseaux, DNS, TLS
- Bases des technologies web HTTP, cookies, REST, CORS, cache
- Bases des communications sans fil Modulation, OFDM, MIMO et circuits RF
- Bases de la sécurité de l'information Cryptographie, authentification, attaques web
- Bases des bases de données SQL, normalisation, transactions
- Structures de données et algorithmes Complexité, recherche, tris, graphes
- Bases de la programmation (trace de pseudo-code) Pseudo-code, trace, tableaux et récursion
- Développement logiciel et gestion de projet Processus, tests, délais et coûts
- Bases de la stratégie d'entreprise et de la comptabilité Comptabilité, seuil de rentabilité, stratégie, marketing
- Gestion des services et audit des systèmes d'information SLA, incidents et problèmes, audit et contrôle interne
- Architecture des systèmes et fiabilité Redondance, RAID, sauvegardes et cloud
- Analyse des performances Loi d'Amdahl, CPI, goulots d'étranglement
- Sécurité matérielle Canaux auxiliaires, secure boot, TEE, PUF
- Gestion de l'énergie DVFS, power gating, états de veille