我在下面有一些结构定义:
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结构的实例,但这会引入额外的消耗内存的对象。
答案 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)