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

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

最佳答案

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

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

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

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

关于c - 在 C99 中初始化包含指向另一个结构的指针的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16164200/

相关文章:

c - Malloc 不会创建具有所需大小的结构数组

c++ - 结构的 Xcode typedef 创建错误/警告

java - java中通过函数调用给data赋值之前不需要使用new显式分配内存吗

c - 使用CGO将Go嵌套结构的数组转换为C?

c - 设置 R 包中动态链接库的目录路径

c++ - 如何读取/重定向 dos 命令的输出到 C/C++ 中的程序变量?

c - 为什么下面的代码不起作用?

c++ - 在 C/C++ 中递归查找最大差值对

c - 为什么结构体不能成为其自身的成员?

python - 如何扩展 Python 类初始化