1

以下にいくつかの構造定義を示します。

typedef struct { 
  uint16_t a ;
} my_type1_t ;

typedef struct { 
  uint16_t b ; 
} my_type2_t ; 

typedef struct {
  my_type1_t* a_ptr ;
  my_type2_t* b_ptr ;
} both_t ; 

typedef struct {
  both_t* both_ptr ;
} gathered_t 

および上記の構造のいくつかのインスタンス:

my_type1_t a = { 
  .a = 0x01U,
} ;

my_type2_t b = { 
  .b = 0xAAU,
} ;

以下のように構造の初期化を行うために、C99標準以上でこれが可能かどうかを尋ねたいと思います:

gathered_t all = {
  .both_ptr.a_ptr = &a,
  .both_ptr.b_ptr = &b,
};

この問題の解決策は both_t 構造体のインスタンスを定義することですが、これによりメモリを消費する追加のオブジェクトが導入されます。

4

3 に答える 3

3

構造体はポインター型を宣言しているため、オブジェクトのメモリをどこかに割り当てる必要があります。ただし、そのために変数を宣言する必要はありません。複合リテラルで行うことができます。

gathered_t all = {
  .both_ptr = &(both_t){ 
     .a_ptr = &a,
     .b_ptr = &b,
   }
};

複合リテラルは、この初期化が見つかったスコープに従って割り当てられます。ファイルスコープにある場合、割り当ては静的になります。それ以外の場合は、自動 (「スタック」上) になります。

ここで、 の宣言にストレージ指定子を追加しない場合all、この複合リテラルはその変数と同じ有効期間を持つことになります。

于 2013-04-23T08:20:25.360 に答える
0

これを試して

gathered_t all = {
    .both_ptr = &(both_t){ &a, &b }
};

http://codepad.org/kGxiPPxTの完全な例

于 2013-04-23T08:22:30.163 に答える
0

いいえ、それは不可能です。both_tとにかくメモリが必要になります。だから解決策

both_t both = { &a, &b };
gathered_t all = { &both };

期待どおりの量のメモリを使用します。

both実際にC99の新機能を示す新しい変数の導入を避けるために、他の回答を参照してください。

于 2013-04-23T08:15:04.880 に答える