C嵌套结构初始化-初始化了什么



假设我有结构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.s1t.s2进行初始化/置零?

然后,如果我写:

int a[8];

是8个零,还是8个随机值,最有可能是零?

再说一遍,我想我应该写

int a[8] = {};

有8个特定的零,但我不确定。

关于:

T[8] = {};

是8个初始化的Ts,还是8个未初始化/随机的Ts?

如何正确初始化/清零此类嵌套结构和数组?

我所说的初始化是指到处都是零。

对象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 };

最新更新