将结构初始化为0

如果我有这样的结构:

typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;

将此结构体初始化为0的最简单方法是什么? 以下内容是否足够?

myStruct _m1 = {0};

还是需要显式地将每个成员初始化为0?

myStruct _m2 = {0,0};
236547 次浏览

第一个是最简单的(需要更少的打字) ,它是保证工作,所有成员将被设置为 0[参考文献1]
第二个更易读。

选择取决于用户的首选项或者您的编码标准所要求的首选项。

[参考文献1] 参考文献 C99标准6.7.8.21:

如果括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化大小已知的数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应该与具有静态存储持续时间的对象隐式初始化相同。

阅读:
C 和 C + + : 自动结构的部分初始化

如果数据是静态或全局变量,那么默认情况下它是零填充的,因此只需声明它为 myStruct _m;

如果数据是局部变量或堆分配的区域,则使用 memset清除它,如下所示:

memset(&m, 0, sizeof(myStruct));

当前的编译器(例如 gcc的最新版本)在实践中对此进行了很好的优化。只有当所有的零值(包括空指针和浮点零)都表示为所有的零位时,这种方法才有效,这在我所知道的所有平台上都是正确的(但是 C标准允许这种错误的实现; 我不知道有这样的实现)。

您也许可以编码 myStruct m = {};myStruct m = {0};(即使 myStruct的第一个成员不是标量)。

我的感觉是,对本地结构使用 memset是最好的,它更好地传达了这样一个事实: 在运行时,必须做一些事情(而通常,全局和静态数据可以理解为在编译时初始化,在运行时没有任何成本)。

参见6.7.9初始化:

如果括号内的列表中的初始值设定项少于元素或成员 或字符串文字中的较少字符,用于初始化已知的 大于数组中的元素,则聚合的其余部分应为 隐式初始化与具有静态存储持续时间的对象相同。

所以,是的,他们都工作。注意,在 C99中也可以使用一种新的初始化方法,称为指定初始化:

myStruct _m1 = {.c2 = 0, .c1 = 1};

我也认为这会起作用,但这是误导性的:

myStruct _m1 = {0};

当我试着这样做的时候:

myStruct _m1 = {0xff};

只有第一个字节被设置为 0xff,其余的字节被设置为 0。所以我不会养成用这个的习惯。