【问题标题】:Initializing a Struct of a Struct初始化结构的结构
【发布时间】:2012-10-03 06:05:55
【问题描述】:

如果我在 C 中有一个包含整数和数组的结构,我如何将整数初始化为 0,将数组的第一个元素初始化为 0,如果该结构是另一个结构的成员,那么对于另一个结构是整数和数组有那些初始化值?

【问题讨论】:

标签: c


【解决方案1】:

初始化器可以嵌套在嵌套结构中,例如

typedef struct {
    int j;
} Foo;

typedef struct {
    int i;
    Foo f;
} Bar;

Bar b = { 0, { 0 } };

【讨论】:

    【解决方案2】:

    我希望这个示例程序对您有所帮助....

    #include <stdio.h>
    
    typedef struct
    {
            int a;
            int b[10];
    }xx;
    
    typedef struct
    {
            xx x1;
            char b;
    }yy;
    
    int main()
    {
    
    yy zz = {{0, {1,2,3}}, 'A'};
    
    
    printf("\n %d  %d  %d %c\n", zz.x1.a, zz.x1.b[0], zz.x1.b[1], zz.b);
    
    return 0;
    }
    

    yy zz = {{0, {0}}, 'A'}; 将初始化数组 b[10] 的所有元素将设置为 0。

    就像@unwind 建议一样,在 C 中创建的所有实例都应该手动初始化。这里没有构造函数类型的机制。

    【讨论】:

    • 您仍然可以在 C 中使用构造函数/析构函数,缺点是您必须显式调用它们,它们不会像在具有内置 OO 支持的语言中那样自动调用。例如,请参阅我的答案。
    • @Lundin 谢谢。但是需要为每个实例调用 mystruct_construct() 对吗???
    【解决方案3】:

    您可以使用 {0} 对整个结构进行 0 初始化。

    例如:

    typedef struct {
      char myStr[5];
    } Foo;
    
    typedef struct {
        Foo f;
    } Bar;
    
    Bar b = {0}; // this line initializes all members of b to 0, including all characters in myStr.
    

    【讨论】:

    • 有没有办法在Bar里面初始化Foo?
    • 您的意思是 b.f = {0} 还是 b.f = someOtherF?否则 C 中没有构造函数,因此您无法为 f 实现默认初始化。
    【解决方案4】:

    C 没有构造函数,因此除非您在每种情况下都使用初始化表达式,即编写类似的东西

    my_big_struct = { { 0, 0 } };
    

    要初始化内部结构,您必须添加一个函数并确保在所有“实例化”结构的情况下都调用它:

    my_big_struct a;
    
    init_inner_struct(&a.inner_struct);
    

    【讨论】:

    • 使用“不透明类型”(也称为不完整类型)执行此操作更安全、更优雅。然后调用者将无法访问结构的私有成员变量。
    【解决方案5】:

    这是一个替代示例,您将如何使用面向对象的设计来做这样的事情。请注意,此示例使用运行时初始化。

    mystruct.h

    #ifndef MYSTRUCT_H
    #define MYSTRUCT_H
    
    typedef struct mystruct_t mystruct_t;  // "opaque" type
    
    const mystruct_t* mystruct_construct (void);
    
    void mystruct_print (const mystruct_t* my);
    
    void mystruct_destruct (const mystruct_t* my);
    
    #endif
    

    mystruct.c

    #include "mystruct.h"
    #include <stdlib.h>
    #include <stdio.h>
    
    struct mystruct_t   // implementation of opaque type
    {
      int x; // private variable
      int y; // private variable
    };
    
    
    const mystruct_t* mystruct_construct (void)
    {
      mystruct_t* my = malloc(sizeof(mystruct_t));
    
      if(my == NULL)
      {
        ; // error handling needs to be implemented
      }
    
      my->x = 1;
      my->y = 2;
    
      return my;
    }
    
    void mystruct_print (const mystruct_t* my)
    {
      printf("%d %d\n", my->x, my->y);
    }
    
    
    void mystruct_destruct (const mystruct_t* my)
    {
      free( (void*)my );
    }
    

    main.c

       int main (void)
       {
          const mystruct_t* x = mystruct_construct();
    
          mystruct_print(x);
    
          mystruct_destruct(x);
    
          return 0;
       }
    

    您不一定需要使用 malloc,您也可以使用私有的、静态分配的内存池。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多