我在下面有一些结构定义:
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 结构的实例,但是这会引入消耗内存的额外对象。
最佳答案
由于您的结构声明了指针类型,因此您必须在某处为该对象分配内存。但是你不需要为此声明一个变量,一个复合文字就可以了:
gathered_t all = {
.both_ptr = &(both_t){
.a_ptr = &a,
.b_ptr = &b,
}
};
复合字面量是根据找到这个初始化的范围分配的;如果它在文件范围内,分配将是静态的,否则它将是自动的(在“堆栈”上);
在这里,如果您不在 all
的声明中添加任何存储说明符,则此复合文字将与该变量具有相同的生命周期。
关于c - 在 C99 中初始化包含指向另一个结构的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16164200/