linux c 结构体,Linux C 结构体初始化三种形式

最近看linux代码时发现了结构体 struct 一种新的初始化方式,各方查找对比后总结如下:

1. 顺序初始化

教科书上讲C语言结构体初始化是按照顺序方式来讲的,没有涉及到乱序的方式。顺序初始化struct必须要按照成员的顺序进行,缺一不可,如果结构体比较大,很容易出现错误,而且表现形式不直观,不能一眼看出各个struct各个数据成员的值。

2.乱序初始化

乱序初始化是C99标准新加的,比较直观的一种初始化方式。相比顺序初始化而言,乱序初始化就如其名,成员可以不按照顺序初始化,而且可以只初始化部分成员,扩展性较好。linux内核中采用这种方式初始化struct。

目前看到3种不同的乱序初始化方式:

一是用点(.)符号, 二是用冒号(:), 三是当字段是数组时可使用索引初始化。

比较推荐的方式是第一种!

直接看示例代码吧:

1 typedef structal_data2 {3 inta;4 intb;5 intc;6 charch;7 }al_data;8

9 struct al_data ad =

10 {11 1,12 3,13 9,14 'A',15 };16

17 struct al_data ad2 =

18 {19 .a = 2,20 .b = 6,21 .c = 18,22 .ch = 'B',23 };24

25 struct al_data ad3 =

26 {27 a:3,28 b:9,29 c:27,30 ch:'C'

31 };32

33

34 intmain()35 {36

37 printf("ad.a=%d, ad.b=%d, ad.c=%d, ad.ch=%c \n", ad.a, ad.b, ad.c, ad.ch);38 printf("ad2.a=%d, ad2.b=%d, ad2.c=%d, ad2.ch=%c \n", ad2.a, ad2.b, ad2.c, ad2.ch);39 printf("ad3.a=%d, ad3.b=%d, ad3.c=%d, ad3.ch=%c \n", ad3.a, ad3.b, ad3.c, ad3.ch);40 return 0;41 }

上面是顺序初始化和前两种乱序初始化。

ba613144858c8cf64b251a6938ca811f2f4.jpg

从结果看确实都可以初始化成功。

最后看下数组索引初始化方式:

1 structst_al2 {3 inti;4 al_data ald[3];5 };6

7 struct st_al sa =

8 {9 .i = 1,10 .ald =

11 {12 [0] = {4,5,6,'q'},13 [1] = {8,9,10,'w'},14 },15 };

da1b7e1a6d1dfcd86a38b8f91a1ffc0dad3.jpg

验证也是通过的!但其实索引后接的内容也是形如顺序初始化。。。。

最后写一个陷阱,不要混用不同的初始化方式,以免带来意料之外的错误

比如:先用. 初始化后面跟着顺序初始化是上一个元素的下一个元素值,容易错

1 struct al_data ad2 =

2 {3 .c = 18,4 .b = 6,5 3,6 .ch = 'B',7 };

第5行其实相当于  .c = 3

311bf068495bc36111326a0ca94d478c3f9.jpg

没有初始化的a赋值为了0,但不是绝对的,需要0还是手动赋值!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值