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

不,那是不可能的。both_t无论如何,您将需要内存。所以解决方案

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

将使用与您期望的一样多的内存。

请参阅其他答案以避免引入新变量both,这确实显示了 C99 的新功能。

于 2013-04-23T08:15:04.880 回答
0

试试这个

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

完整示例在http://codepad.org/kGxiPPxT

于 2013-04-23T08:22:30.163 回答