Qu'est-ce que struct (structure C) ?
Mécanisme du C qui regroupe plusieurs valeurs (membres), éventuellement de types différents, en un seul type. On la définit par exemple avec struct sensor { int id; float value; }; on utilise alors les membres d'une variable s sous la forme s.id, et à travers un pointeur p sur une struct sous la forme p->id. Les membres sont rangés en mémoire dans l'ordre de déclaration, mais du remplissage (padding) peut être inséré entre eux pour l'alignement, si bien que la taille totale peut dépasser la somme des tailles des membres.
Nom japonais: 構造体
« struct (structure C) » apparaît dans 11 questions d'entraînement réparties sur 7 thèmes, dont ISA et assembleur, Bases de la programmation en C, Systèmes embarqués et firmware.
Domaine: Bases de la programmation en C
Définition et utilisation
Avec la définition struct point { int x; int y; };, on crée une variable comme struct point p = {1, 2}; et on utilise chaque membre sous la forme p.x ou p.y. Donner un alias avec typedef, comme typedef struct { … } Point;, permet de déclarer Point p; sans écrire struct. Les structs peuvent être affectées d'un bloc avec =, passées en argument à des fonctions et servir de valeur de retour, mais on passe en général les grandes structs par pointeur.
Disposition en mémoire
Les membres sont placés dans l'ordre de déclaration, des adresses basses vers les adresses hautes. Du remplissage (padding) est inséré avant un type qui doit être aligné, comme un int de 4 octets sur une frontière de 4 octets, et la taille de la struct entière est arrondie à un multiple de son alignement le plus strict. Ainsi, une struct contenant char, int et char dans cet ordre occupe 12 octets dans un environnement courant où int fait 4 octets, et placer l'int en premier la réduit à 8 octets.
Questions fréquentes
Quelle différence y a-t-il entre une struct et un tableau ?
Un tableau aligne des éléments du même type, que l'on choisit par un indice. Une struct regroupe des membres de types éventuellement différents, que l'on choisit par leur nom. Les deux se combinent souvent, comme dans un tableau de structs ou une struct qui a un tableau comme membre.
Pourquoi faut-il vérifier la taille d'une struct avec sizeof ?
La quantité de padding entre les membres et après le dernier dépend de la taille des types et des règles d'alignement (l'ABI) : additionner les tailles des membres ne donne pas la bonne taille. Pour allouer une struct avec malloc ou l'écrire dans un fichier, on obtient sa taille réelle avec sizeof(struct nom).