初始化一个结构为0初始化一个结构为0(Initializing a struct to 0)

2019-06-02 17:57发布

如果我有这样的结构:

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

什么是初始化这个结构为0,最简单的方法? 将以下就足够了?

myStruct _m1 = {0};

或者我是否需要每个成员明确初始化为0?

myStruct _m2 = {0,0};

Answer 1:

第一个是最简单的( 涉及较少的打字 ),并且它保证工作,所有成员将被设定为0 [参考1]。
第二个是更具有可读性。

选择取决于用户的喜好或你的编码标准的任务之一。

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

如果在一个大括号内的列表更少初始化比有元件或部件的集合体,或更少的字符在字面使用除了有数组中的元素,所述聚集体的其余部分应初始化已知大小的阵列的串被隐式初始化一样具有静态存储持续时间的对象。

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



Answer 2:

如果数据是静态或全局变量,它是由默认零填充,所以才宣布它myStruct _m;

如果数据是一个局部变量或堆分配区,明确它memset所示:

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

目前的编译器(如最近的几个版本的gcc )优化是相当不错的做法。 这只有当所有零个值(包括空指针或浮点零)表示为全零位,这是我知道的所有平台真(但C标准允许实现中这是假的,我不知道有这样的实现) 。

也许你可以代码myStruct m = {};myStruct m = {0}; (即使第一构件myStruct不是标)。

我的感觉是,使用memset局部结构是最好的,并传递更好的在运行时,有些事情要做的事实(而通常情况下,全局和静态数据,可以在编译时初始化的理解,而无需在运行任何代价)。



Answer 3:

见§6.7.9初始化:

21如果在一个大括号内的列表更少初始化之外还有使用除有数组中的元素来初始化已知大小的阵列,所述聚集体的其余部分的元件或聚集体的成员,或更少的字符在字符串文字应隐式初始化一样具有静态存储持续时间的对象。

所以,是他们两人的工作。 请注意,在C99初始化一个新的方式,称为指定初始化可以在太习惯:

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


文章来源: Initializing a struct to 0