如果我有这样一个结构:
typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;
将该结构初始化为 0 的最简单方法是什么? 下面的方法可以吗?
myStruct _m1 = {0};
还是我需要显式地将每个成员初始化为 0?
myStruct _m2 = {0,0};
第一种方法最简单(涉及键入较少),而且保证有效,所有成员都将设置为 "0"[参考 1]。
第二种方法更具可读性。
这取决于用户的偏好或编码标准的规定。
[Ref 1] 参考 C99 标准 6.7.8.21:
如果在一个括号封闭的列表中,初始化器的数量少于集合的元素或成员的数量,或者在一个用于初始化已知大小数组的字符串字面中,初始化器的字符数少于数组中的元素数量,那么集合的其余部分应被隐式初始化,就像具有静态存储持续时间的对象一样。
精彩阅读: https://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure
如果数据是静态或全局变量,则默认为零填充,因此只需将其声明为 myStruct _m;
即可。
如果数据是局部变量或堆分配区,则使用 memset
清除:
memset(&m, 0, sizeof(myStruct));
目前的编译器(例如最新版本的 gcc
)在实际操作中对此进行了很好的优化。这只有在所有零值(包括空指针和浮点零值)都表示为零位时才有效,据我所知,这在所有平台上都是正确的(但C标准允许在错误的情况下实现这一点;我不知道有这样的实现)。
也许你可以编写 myStruct m = {};
或 myStruct m = {0};
(即使 myStruct
的第一个成员不是标量)。
我的感觉是,对局部结构使用 memset
是最好的,它能更好地传达这样一个事实:在运行时,必须做一些事情(而通常情况下,全局数据和静态数据可以理解为在编译时初始化的,在运行时没有任何代价)。
请参阅 §6.7.9 初始化:
21 如果在一个括号包围的列表中,初始化器的数量少于元素或集合成员的数量,或者在用于初始化已知数组的字符串字面中,字符的数量少于元素或集合成员的数量。 或用于初始化已知大小数组的字符串字面意义中的字符数少于数组中的元素数。 或用于初始化已知大小数组的字符串字面中的字符数少于数组中的元素数,则聚合体的其余部分应被 与静态存储时间的对象相同。
因此,这两种方法都是可行的。请注意,在 C99 中还可以使用一种新的初始化方式,即指定初始化:
myStruct _m1 = {.c2 = 0, .c1 = 1};