Bases de la programmation en C

struct S { char c; int i; char d; };
struct T { int i; char c; char d; };
printf("%zu %zu\n", sizeof(struct S), sizeof(struct T));

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 ?

  1. A6 6
  2. B9 6
  3. C12 8
Afficher la réponse et l'explication

Réponse : C. 12 8

Un int est placé à une adresse multiple de 4 : dans struct S, 3 octets de remplissage (padding) sont insérés après c, i est placé au décalage 4 et d au décalage 8. De plus, la taille de la struct entière est arrondie au multiple de 4 supérieur pour que i reste aligné dans chaque élément d'un tableau de structs : 3 octets sont ajoutés après les 9 octets, ce qui donne 12 octets. Dans struct T, c et d suivent i, soit 6 octets, arrondis à 8 octets. Ranger les membres du type le plus grand au plus petit réduit le padding.

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

Autres questions sur Bases de la programmation en C

  1. 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 ?
  2. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui stocke 9 dans un champ de bits de 3 bits ?
  3. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise la macro SQUARE définie par #define ?
  4. 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 ?
  5. Quelle est la sortie obtenue lorsque le code ci-dessus est écrit dans la fonction main et exécuté ?