web-dev-qa-db-ja.com

構造体宣言の最後にあるこの[1]の目的は何ですか?

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(この匿名構造体の)1つのメンバーを持つ配列になりますが、その用途を想像することはできません。何か案は?

92
Alexander

これは、Cで「参照型」を作成する一般的なトリックです。関数の引数として使用すると、プログラマが明示的に&演算子を使用する必要なく、単一要素配列が最初の要素へのポインタになりますそのアドレスを取得します。宣言されている場合、それは実際のスタック型です(動的な割り当ては不要です)が、引数として渡されると、呼び出された関数はコピーではなく、ポインタを受け取ります。したがって、安価に渡されますconst)。

GMPはmpz_tタイプで同じトリックを使用します。これは、構造が動的に割り当てられたメモリへのポインターを管理するため重要です。 mpz_init関数は、構造体のコピーではなく、構造体へのポインターの取得に依存しています。または、構造体をまったく初期化できませんでした。同様に、多くの操作は動的に割り当てられたメモリのサイズを変更できますが、呼び出し側の構造体を変更できない場合は機能しません。

110
ShadowRanger