variable initialize example array c struct reverse-engineering declaration

initialize - struct c++



¿Cuál es el propósito de esto[1] al final de la declaración de estructura? (1)

Estaba husmeando a través de los archivos de encabezado de mi microcontrolador MSP430, y me encontré con esto en <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 */

Entiendo que declara una estructura anónima y typedef es jmp_buf , pero no puedo entender para qué sirve el [1] . Sé que declara que jmp_buf es una matriz con un miembro (de esta estructura anónima), pero no puedo imaginar para qué se usa. ¿Algunas ideas?


Este es un truco común para hacer un "tipo de referencia" en C, donde usarlo como argumento de función hace que la matriz de un solo elemento se degrade a un puntero a su primer elemento sin que el programador necesite usar explícitamente el operador & para obtener su dirección . Donde se declara, es un tipo de pila real (no se necesita asignación dinámica), pero cuando se pasa como argumento, la función llamada recibe un puntero, no una copia, por lo que se pasa a bajo costo (y puede ser mutada por la función llamada si no const )

GMP usa el mismo truco con su tipo mpz_t , y es crítico allí, porque la estructura maneja un puntero a la memoria asignada dinámicamente; la función mpz_init basa en obtener un puntero a la estructura, no una copia de la misma, o no se pudo inicializar en absoluto. Del mismo modo, muchas operaciones pueden cambiar el tamaño de la memoria asignada dinámicamente, y eso no funcionaría si no pudieran mutar la estructura de la persona que llama.