100 votes

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 à quoi sert le [1] . Je sais qu'il déclare 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?

123voto

ShadowRanger Points 44

Il s'agit d'un truc pour faire un "type de référence" dans C, où l'utiliser comme un argument de fonction provoque le seul élément de tableau à se dégrader à un pointeur vers son premier élément sans le programmeur d'avoir à utiliser de manière explicite l' & opérateur pour obtenir son adresse. Où déclarée, c'est un vrai type de pile (pas d'allocation dynamique nécessaire), mais lorsqu'il est passé en argument, l'appelle de la fonction reçoit un pointeur vers elle, pas une copie, donc il est transmis à moindre coût (et peut être muté par la fonction appelée si ce n' const).

GMP utilise la même astuce avec ses mpz_t type, et c'est essentiel, parce que la structure gère un pointeur vers la mémoire allouée dynamiquement; l' mpz_init fonction s'appuie sur l'obtention d'un pointeur vers la structure, pas une copie de celui-ci, ou il n'a pas pu initialiser tous. De même, de nombreuses opérations peuvent redimensionner la mémoire allouée dynamiquement, et qui ne fonctionnent pas si ils ne pouvaient pas la mutation de l'appelant struct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X