[解決済み] 構造体宣言の最後にある[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
関数は構造体のコピーではなくポインタの取得に依存しており、さもなければ初期化することができません。同様に、多くの操作は動的に割り当てられたメモリのサイズを変更することができ、呼び出し元の構造体を変更できなければ機能しないでしょう。
関連
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] C++のstructとclassの違いは何ですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
-
[解決済み] 1行のifやループに中括弧(={})を使用する目的は何ですか?
-
[解決済み】定義と宣言の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
未定義の `__isoc99_sscanf' への参照
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?