Quel est le but de ceci à la fin de la déclaration de structure?

J’ai fouillé dans les fichiers d’en-tête de mon microcontrôleur MSP430 et je me suis retrouvé dans :

 /* r3 does not have to be saved */ typedef struct { uint32_t __j_pc; /* return address */ uint32_t __j_sp; /* r1 stack pointer */ uint32_t __j_sr; /* r2 status register */ uint32_t __j_r4; uint32_t __j_r5; uint32_t __j_r6; uint32_t __j_r7; uint32_t __j_r8; uint32_t __j_r9; uint32_t __j_r10; uint32_t __j_r11; } jmp_buf[1]; /* size = 20 bytes */ 

Je comprends qu’il déclare une structure anonyme et typedef le fait à jmp_buf , mais je ne peux pas comprendre à quoi sert le [1] . Je sais que jmp_buf est un tableau avec un membre (de cette structure anonyme), mais je ne peux pas imaginer à quoi il sert. Des idées?

C’est un truc courant pour créer un “type de référence” dans C, où l’utiliser comme argument de fonction entraîne la dégradation du tableau d’éléments simples en un pointeur vers son premier élément sans que le programmeur doive utiliser explicitement l’opérateur & pour obtenir son adresse . Où déclaré, c’est un vrai type de stack (pas d’allocation dynamic nécessaire), mais quand il est passé en argument, la fonction appelée reçoit un pointeur, pas une copie, donc elle passe à bas prix (et peut être mutée par la fonction appelée). const ).

GMP utilise le même truc avec son type mpz_t , et il y est critique, car la structure gère un pointeur vers la mémoire allouée dynamicment; la fonction mpz_init repose sur l’obtention d’un pointeur sur la structure, pas sur une copie, ou ne peut pas l’initialiser du tout. De même, de nombreuses opérations peuvent redimensionner la mémoire allouée dynamicment et cela ne fonctionnerait pas si elles ne pouvaient pas modifier la structure de l’appelant.