结构体的指定初始化

本文介绍了Linux内核中如何利用C99的指定初始化特性来初始化结构体,通过实例展示了如何指定初始化结构体成员,并解释了成员初始化的顺序规则。同时提到了指定初始化在C Primer Plus第五版中的相关描述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在Linux内核中,很多结构体的初始化都使用了C99支持的指定结构体初始化的特性,如init_task的初始化等。

  结构体的指定初始化语法与数组的指定初始化项目相似,只是,结构体的指定初始化使用点运算符和成员名来标识具体元素。

    如在C Primer Plus(第五版)中提到的结构体 struct book:

    struct book 

   {
       char title[MAXTITL];
       char author[MAXAUTL];
       float value;
   };

   只初始化book结构的成员value,如下:

    struct book surprise = { .value = 20.99 };

   也可以按照任意的顺序使用指定初始化,如下:

    struct book gift = {  .value = 80.66,
                                    .author = "James Broadfool",
                                    .title = "C Primer Plus"};

   正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
    struct book gift = { .value = 18.90,
                                    .author = "Philionna pestle",
                                    10.25};
    这将把值10.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值10.25代替了早先的赋值18.90。

    有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。


参考资料:

       C Primer Plus(第五版) 中的”结构和其他数据形式“中”结构的指定初始化项目“

       http://blog.chinaunix.net/u2/66435/showart_1299732.html

### 结构体初始化的方法 在 C 语言中,结构体可以通过多种方式进行初始化。以下是常见的几种方法及其示例。 #### 1. **顺序初始化** 按照成员定义的顺序依次赋值给结构体中的各个字段。如果只需要初始化部分成员,则未初始化的部分会被默认设为零[^2]。 ```c typedef struct { int a; float b; char c; } MyStruct; MyStruct s = {10, 3.14f}; // 只初始化前两个成员,第三个成员 'c' 默认为 '\0' ``` #### 2. **指定初始化器 (Designated Initializers)** 通过指定成员名称的方式对其进行初始化。这种方式可以跳过某些不需要初始化的成员,并且不依赖于成员声明的顺序。 ```c typedef struct { int x; double y; char z; } AnotherStruct; AnotherStruct as = {.y = 2.718, .z = 'A', .x = 5}; // 成员按指定顺序初始化,其余未提及的成员也会被置为零 ``` #### 3. **嵌套结构体初始化** 当一个结构体包含另一个结构体作为其成员时,可以直接对其子结构体进行初始化。这种情况下,可以采用多层大括号来分别表示不同层次的内容[^3]。 ```c typedef struct { unsigned int field1; unsigned int field2; } InnerStruct; typedef struct { InnerStruct inner; int outerField; } OuterStruct; OuterStruct os = {{1, 2}, 3}; /* 上述代码等价于: * os.inner.field1 = 1; * os.inner.field2 = 2; * os.outerField = 3; */ ``` 对于更复杂的嵌套情况: ```c typedef struct { unsigned int w; unsigned int h; } Dimension; typedef struct { Dimension size; int id; } Widget; Widget widget = {{{1920, 1080}}, 1}; /* 等效操作如下: * widget.size.w = 1920; * widget.size.h = 1080; * widget.id = 1; */ ``` --- #### 总结 以上展示了三种主要的结构体初始化方式:顺序初始化指定初始化以及嵌套结构体初始化。每种方法各有优劣,开发者可以根据实际需求灵活选用合适的方案[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值