假设我有结构s:
typedef struct
{
int x;
int y;
} S;
然后:
S s; // s is uninitialized here.
和:
S s = {}; // s is initialized (zeroed) here.
现在假设我有结构T:
typedef struct
{
S s1;
S s2;
} T;
我这样初始化它:
T t = {}; // is t completely initialized?
我只是猜测t.s1.x
可以包含一个随机值,对吧?
我必须写吗:
T t = {{}, {}};
是否需要对t.s1
和t.s2
进行初始化/置零?
然后,如果我写:
int a[8];
是8个零,还是8个随机值,最有可能是零?
再说一遍,我想我应该写
int a[8] = {};
有8个特定的零,但我不确定。
关于:
T[8] = {};
是8个初始化的T
s,还是8个未初始化/随机的T
s?
如何正确初始化/清零此类嵌套结构和数组?
我所说的初始化是指到处都是零。
对象s
是否在此声明中初始化
S s; // s is uninitialized here.
取决于声明的放置位置。如果声明被放置在文件范围内,那么该对象被零初始化为具有静态存储持续时间的对象。如果声明被放置在块作用域中,那么该对象将被取消初始化为具有自动存储持续时间的对象,并且具有不确定的值。
这些都是声明
S s = {}; // s is initialized (zeroed) here
T t = {}; // is t completely initialized?
T t = {{}, {}};
int a[8] = {};
在C中无效,因为不能使用空大括号初始化对象。
要对块作用域中的对象t
进行零初始化,您应该编写例如
T t = { 0 };
或
T t = { { 0 } };
要在块范围内对数组a
(其所有元素(进行零初始化,您应该编写例如
int a[9] = { 0 };