初始化包含指向C99中另一个结构的指针的结构

时间:2013-04-23 08:10:14

标签: c struct initialization c99

我在下面有一些结构定义:

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结构的实例,但这会引入额外的消耗内存的对象。

3 个答案:

答案 0 :(得分:3)

由于您的结构声明了一个指针类型,您必须在某处为该对象分配内存。但是你不需要为此声明一个变量,复合文字会这样做:

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

根据找到初始化的范围分配复合文字;如果它在文件范围内,则分配将是静态的,否则它将是自动的(在“堆栈”上);

在这里,如果你没有在all的声明中添加任何存储说明符,那么这个复合文字将具有与该变量相同的生命周期。

答案 1 :(得分:0)

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

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

将使用与您期望的完全相同的内存。

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

答案 2 :(得分:0)

试试这个

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

http://codepad.org/kGxiPPxT

的完整示例