【问题标题】:Initialization of the structure containing pointer to another structure in C99在 C99 中初始化包含指向另一个结构的指针的结构
【发布时间】:2013-04-16 08:43:48
【问题描述】:

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

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

【问题讨论】:

    标签: c struct initialization c99


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我已经检查了你的解决方案,它似乎工作正常,但是你能告诉我这个对象是在哪里分配的吗?在堆栈上?
    • 我再次检查了我的地图文件,发现这个对象基本上分配在 RAM 内存中,但没有分配任何符号。
    • 非常感谢 Jens 的回答,非常有帮助。
    【解决方案2】:

    不,那是不可能的。无论如何,您都需要为both_t 提供内存。所以解决办法

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

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

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

    【讨论】:

    • 是的,我打字后才意识到自己的错误。
    • @BryanOliver 嘿 Bryan,你的代码对我来说很有意义,因为这是我在书中读到的。但是你能告诉我那些语法链接 {.both_ptr={.a_ptr=&a,.b_ptr=&b}} 和东西是什么意思吗?他们为什么要附加一个“。”。我错过了什么?我需要学习什么才能理解它?我的 C 书中没有提到。
    • @BryanOlivier 什么字段名称?您能详细说明一下吗?我只阅读了您在编辑答案之前提到的语法。就像gathered_t all = {{&a,&b}}。我错过了什么?C99 是否引入了一个全新的色域语法和规则?
    • @BryanOlivier 熟悉 C99 有多紧迫?我想我只知道 C89,还没有遇到太多问题.....
    • C99 增加了便利功能,在这方面它避免了考虑变量的名称并能够将它们放置在您实际打算定义的结构中。在这方面,所有 C89 的东西都在继续工作。
    【解决方案3】:

    试试这个

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

    http://codepad.org/kGxiPPxT 上的完整示例

    【讨论】:

    • 非常感谢阿伦这个答案似乎也是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多