1. ホーム
  2. c

[解決済み] 構造体宣言の最後にある[1]は何のためにあるのですか?

2023-01-25 23:55:23

質問

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つのメンバーを持つ配列であると宣言していることは知っていますが、それが何に使われるのか想像がつきません。何かアイデアはありますか?

どのように解決するのですか?

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

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