如果我有这样的结构:
typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;
将此结构初始化为0的最简单方法是什么? 以下是否足够?
myStruct _m1 = {0};
或者我是否需要将每个成员显式初始化为0?
myStruct _m2 = {0,0};
答案 0 :(得分:119)
第一个是最简单的(涉及较少的输入),并且保证可以正常工作,所有成员都将设置为0
[Ref 1] 。
第二个更具可读性。
选择取决于用户偏好或编码标准要求的偏好。
[参考1] 参考C99标准6.7.8.21:
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则剩余的聚合应隐式初始化,与具有静态存储持续时间的对象相同。
好读:
C and C++ : Partial initialization of automatic structure
答案 1 :(得分:23)
如果数据是静态变量或全局变量,默认情况下它是零填充的,所以只需声明它myStruct _m;
如果数据是局部变量或堆分配区域,请使用memset
清除它:
memset(&m, 0, sizeof(myStruct));
当前的编译器(例如gcc
的最新版本)在实践中非常好地优化了。仅当所有零值(包括空指针和浮点零)都表示为全零位时才有效,这在我所知道的所有平台上都是正确的(但 C 标准允许实现这是假的;我不知道这样的实现。)
您可以编码myStruct m = {};
或myStruct m = {0};
(即使myStruct
的第一个成员不是标量)。
我的感觉是将memset
用于本地结构是最好的,它更好地传达了这样一个事实,即在运行时必须要做的事情(通常,全局和静态数据可以理解为在编译时初始化)时间,在运行时没有任何成本)。
答案 2 :(得分:16)
参见§6.7.9初始化:
21如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
所以,是的,他们两个都有效。请注意,在C99中,也可以使用一种新的初始化方法,称为指定初始化:
myStruct _m1 = {.c2 = 0, .c1 = 1};
答案 3 :(得分:1)
我也认为这可以解决问题,但是会产生误导: myStruct _m1 = {0};
当我尝试这样做时: myStruct _m1 = {0xff};
只有第一个字节设置为0xff,其余的字节设置为0。所以我不会养成使用它的习惯。