web-dev-qa-db-fra.com

Quel est le but de cette [1] à la fin de la déclaration de structure?

J'étais en train de fouiller dans les fichiers d'en-tête de mon microcontrôleur MSP430, et je me suis heurté à cela dans <setjmp.h>:

/* 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 que typedef le soit à jmp_buf, mais je ne peux pas comprendre ce que le [1] est pour. Je sais qu'il déclare jmp_buf être un tableau avec un membre (de cette structure anonyme), mais je ne peux pas imaginer à quoi il sert. Des idées?

92
Alexander

Ceci est une astuce courante pour créer un "type de référence" en C, où son utilisation en tant qu'argument de fonction provoque la dégradation du tableau à élément unique en un pointeur sur son premier élément sans que le programmeur ait besoin d'utiliser explicitement le & opérateur pour obtenir son adresse. Où déclaré, il s'agit d'un type de pile réel (aucune allocation dynamique n'est requise), mais lorsqu'il est passé en tant qu'argument, la fonction appelée reçoit un pointeur sur elle, pas une copie, donc elle est transmise à moindre coût (et peut être mutée par la fonction appelée si ce n'est pas le cas. const).

GMP utilise le même truc avec son mpz_t tapez, et c'est essentiel là-bas, car la structure gère un pointeur sur la mémoire allouée dynamiquement; le mpz_init La fonction consiste à obtenir un pointeur sur la structure, pas une copie de celle-ci, ou ne peut l'initialiser du tout. De même, de nombreuses opérations peuvent redimensionner la mémoire allouée dynamiquement, ce qui ne fonctionnerait pas si elles ne pouvaient pas muter la structure de l'appelant.

110
ShadowRanger