提问



我想初始化一个struct元素,在声明和初始化中拆分。这就是我所拥有的:


typedef struct MY_TYPE {
  boolean flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}


这是根据C编程语言标准(C89,C90,C99,C11等)声明和初始化MY_TYPE的局部变量的方法吗?或者有什么更好或至少有效吗?


更新我最终得到了一个静态初始化元素,我根据自己的需要设置了每个子元素。

最佳参考


在(ANSI)C99中,您可以使用指定的初始化程序来初始化结构:


MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };


编辑:其他成员初始化为零:省略的字段成员与具有静态存储持续时间的对象隐式初始化。 (https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html)[30]

其它参考1


你可以用复合文字来做。根据该页面,它适用于C99(也算作ANSI C)。[31] [32]


MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };


初始化器中的名称是可选的;你也可以写:


a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };

其它参考2


我看到你已经收到了关于ANSI C 99的答案,所以我会抛出关于ANSI C 89的问题。
ANSI C 89允许您以这种方式初始化结构:


typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = { 5, 2.2, "George" };
    return 0;
}


需要记住的重要一点是,即使在结构中初始化一个对象/变量,其所有其他变量也将初始化为默认值。


如果不初始化结构中的值,则所有变量都将包含垃圾值。


祝你好运!

其它参考3


a = (MYTYPE){ true, 15, 0.123 };


在C99会很好

其它参考4


你几乎得到了......


MY_TYPE a = { true,15,0.123 };


快速搜索struct initialize c向我展示[33] [34]

其它参考5


正如Ron Nuni所说:


typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = {5, 2.2, "George"};
    return 0;
}


需要记住的重要一点是:在结构中甚至初始化一个对象/变量时,其所有其他变量都将初始化为默认值。


如果你没有初始化你的结构中的值(即如果你只是声明那个变量),那么所有variable.members将包含垃圾值,只有当声明是本地的时才会出现!


如果声明为全局或静态(如本例所示),则所有未初始化的 variable.members 将自动初始化为:



  • 0对于整数和浮点

  • '\0' for char(当然这与0相同,char是整数类型)

  • NULL指针。


其它参考6


C编程语言标准 ISO/IEC 9899:1999 (通常称为C99)允许使用指定的初始化程序来初始化结构或联合的成员,如下所示:


MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };


它在ISO [[IEC 9899:1999标准的paragraph 7部分6.7.8 Initialization中定义为:



??如果指定者具有形式

??。识别结果
??那么当前对象(下面定义)应该具有结构或联合类型,标识符应该是该类型成员的名称。



请注意,同一部分的paragraph 9表明:



??除非另有明确说明,否则为了本子条款的目的,结构和联合类型的对象的未命名成员不参与初始化。 结构对象的未命名成员即使在初始化之后也具有不确定的值。



在GNU GCC实现中,省略的成员被初始化为零或零类型适当的值。如第6.27节GNU GCC文件的指定初始化程序所述:[35]



??省略的字段成员与具有静态存储持续时间的对象一样被隐式初始化。



根据官方博客文章C ++ Conformance Roadmap,Microsoft Visual C ++编译器应该自2013版以来支持指定的初始化程序。 MSDN Visual Studio文档中的Initializers文章的段落Initializing unions and structs表明,与GNU GCC类似,未命名的成员初始化为零的适当值。[36] [37]


新的 ISO/IEC 9899:2011 标准(通常称为C11)已取代ISO/IEC 9899:1999保留了6.7.9 Initialization部分下的指定初始化者。它也保持paragraph 9不变。

其它参考7


void function(void) {
  MY_TYPE a;
  a.flag = true;
  a.value = 15;
  a.stuff = 0.123;
}

其它参考8


如果MS未更新为C99,则MY_TYPE a={true,15,0.123};

其它参考9


我找到了另一种初始化结构的方法。


结构:


typedef struct test {
    int num;
    char* str;
} test;


初始化:


test tt = {
    num: 42,
    str: "nice"
};


根据GCC的文档,自GCC 2.5以来,这种语法已经过时。[38]

其它参考10


我不喜欢这些答案,所以我自己做了。我不知道这是不是ANSI C,它只是GCC 4.2.1的默认模式。我永远不会记得包围,所以我从我的数据子集开始,并与编译器错误消息作斗争,直到它关闭。可读性是我的首要任务。


    // in a header:
    typedef unsigned char uchar;

    struct fields {
      uchar num;
      uchar lbl[35];
    };

    // in an actual c file (I have 2 in this case)
    struct fields labels[] = {
      {0,"Package"},
      {1,"Version"},
      {2,"Apport"},
      {3,"Architecture"},
      {4,"Bugs"},
      {5,"Description-md5"},
      {6,"Essential"},
      {7,"Filename"},
      {8,"Ghc-Package"},
      {9,"Gstreamer-Version"},
      {10,"Homepage"},
      {11,"Installed-Size"},
      {12,"MD5sum"},
      {13,"Maintainer"},
      {14,"Modaliases"},
      {15,"Multi-Arch"},
      {16,"Npp-Description"},
      {17,"Npp-File"},
      {18,"Npp-Name"},
      {19,"Origin"}
    };


数据可以作为制表符分隔的文件开始生活,您可以将其搜索替换为按摩其他内容。是的,这是Debian的东西。所以一对外{}(表示数组),然后是每个结构内部的另一对。用逗号分隔。把东西放在标题中并不是必须的,但是我的结构中有大约50个项目,所以我想把它们放在一个单独的文件中,这样既可以防止我的代码混乱,也更容易替换。

其它参考11


可以声明和初始化C中的结构,如下所示:


typedef struct book
{
    char title[10];
    char author[10];
    float price;
} book;

int main() {
    book b1={"DS", "Ajay", 250.0};

    printf("%s \t %s \t %f", b1.title, b1.author, b1.price);

    return 0;
}