这个在结构声明结尾的目的是什么?

我正在窥探我的MSP430微控制器的头文件,并在<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 */ 

我明白,它声明了一个匿名结构和typedef的jmp_buf ,但我不明白[1]是什么。 我知道它声明jmp_buf是一个成员(这个匿名结构)的数组,但我无法想象它用于什么。 有任何想法吗?

在C中使用“引用types”是一种常见的技巧,使用它作为函数参数会导致单个元素数组降级为指向其第一个元素的指针,而程序员不需要显式地使用&运算符来获取其地址。 在声明的地方,它是一个真正的堆栈types(不需要dynamic分配),但是当作为parameter passing时,被调用的函数会收到一个指向它的指针,而不是副本,所以它被廉价地传递(如果不是, const )。

GMP使用与mpz_ttypes相同的技巧,因为结构pipe理着一个指向dynamic分配内存的指针; mpz_init函数依赖于获取指向结构的指针,而不是它的副本,或者根本不能初始化它。 同样,许多操作可以调整dynamic分配的内存,如果不能改变调用者的结构,这将不起作用。