1.struct 初始化结构体是常用的自定义构造类型是一种很常见的数据打包方法。结构体对象的初始化有多种方式分为顺序初始化、指定初始化、构造函数初始化。假如有如下结构体。1234structA {intb;intc;};1.1 顺序初始化顺序初始化因为书写起来较为简约是我们最常用的初始化方式但相对于指定初始化无法变更数据成员初始化顺序灵活性较差而且表现形式不直观不能一眼看出 struct 各个数据成员的值。1A a {1, 2};1.2 指定初始化指定初始化Designated Initializer实现上有两种方式一种是通过点号加赋值符号实现即.fieldnamevalue另外一种是通过冒号实现即fieldname:value其中 fieldname 为结构体成员名称 。前者是 C99 标准引入的初始化方式后者是 GCC 的扩展。遗憾的是有些编译器并不支持指定初始化比如 Visual C。12345// 点号赋值符号A a {.b 1, .c 2};// 冒号A a {b:1, c:2};Linux 内核喜欢用.fieldnamevalue的方式进行初始化使用指定初始化一个明显的优点是成员初始化顺序和个数可变并且扩展性好比如在结构体非末尾处增加字段时避免了传统顺序初始化带来的大量修改。1.3 构造函数初始化构造函数初始化常见于 C 代码中因为 C 中的 struct 可以看作 class结构体也可以拥有构造函数所以我们可以通过结构体的构造函数来初始化结构体对象。给定带有构造函数的结构体12345678structA {A(intb,intc) {this-bb;this-cc;};intb;intc;}那么结构体对象的初始化可以像类对象初始化那样1A a(1,2);注意struct 如果定义了构造函数的话就不能用大括号进行初始化了即不能再使用指定初始化与顺序初始化了。2.struct 赋值变量的赋值和初始化是不一样的初始化是在变量定义的时候完成的是属于变量定义的一部分赋值是在变量定义完成之后想改变变量值的时候所采取的操作。还是给定结构体 A1234structA {intb;intc;};注意结构体变量的赋值是不能采用大括号的方式进行赋值的例如下面的赋值是不允许的。12A a;a {1,2};// 错误赋值下面列出常见结构体变量赋值的方法。1使用 memset 对结构体变量进行置空操作123// 按照编译器默认的方式进行初始化如果 a 是全局静态存储区的变量默认初始化为0如果是栈上的局部变量默认初始化为随机值A a;memset(a,0,sizeof(a));2依次给每一个结构体成员变量进行赋值123A a;a.b 1;a.c 2;3使用已有的结构体变量给另一个结构体变量赋值。也就是说结构体变量之间是可以相互赋值的。123A a {1,2};structA a1;a1 a;// 将已有的结构体变量赋给 a13.小结初始化与赋值有着本质的区别初始化是变量定义时的第一次赋值赋值则是定义之后的值的变更操作概念上不同所以实现上也不一样。因此我们在对 struct 变量进行其进行的操作时要清晰知晓是初始化还是赋值动作以便采取不同的措施。