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