全部:
在 C 语言中:
struct A
{
int a;
int b;
};
A aa = {0};
该语句仅初始化 aa.a 还是初始化整个结构?或者行为取决于编译器?
提前致谢!
One more ex:
struct A
{
int a;
int b;
};
struct A aa = {5};
这将初始化整个结构,但 aa.b 将被初始化为 0。如果您仅初始化结构的少数成员,则该结构的所有其他成员将自动初始化为 0。
根据 C99 标准,第 6.7.8.17 节,只有第一个成员(按声明顺序,即a
字段)在您的示例中显式初始化:
每个大括号括起来的初始值设定项列表都有一个关联的当前对象。当没有指定时,当前对象的子对象根据当前对象的类型按顺序初始化:数组元素按递增下标顺序,结构成员按声明顺序,以及联合的第一个命名成员。
通过“指定”标准手段
A aa = {.b = 0};
这是让程序员决定初始化哪些字段的更精确的方法。
该语句仅初始化 aa.a 还是初始化整个结构?
看看下面的例子,用 {3} 初始化结构,类似于用 {3,0} 初始化。
因此,在您的程序中,当您使用 {0} 进行初始化时,您实际上是在使用 {0,0} 初始化 a 和 b(整个结构)
#include<stdio.h>
typedef struct A
{
int a;
int b;
}a;
int main()
{
a aa = {3};
printf("\na1 = %d",aa.a);
printf("\nb1 = %d",aa.b);
a bb = {3,0};
printf("\na2 = %d",bb.a);
printf("\nb2 = %d",bb.b);
}
从标准(N1570)
6.7.9 初始化
...
10 如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:
— 如果它具有指针类型,则将其初始化为空指针;
— 如果它具有算术类型,则将其初始化为(正或无符号)零;
— 如果是聚合,则每个成员都根据这些规则(递归地)初始化,并且任何填充都被初始化为零位;
— 如果是联合,则根据这些规则(递归地)初始化第一个命名的成员,并将任何填充初始化为零位;
...
21 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的剩余部分应隐式初始化与具有静态存储持续时间的对象相同。
因此,在您的示例aa.a
中,由于初始化程序,将显式初始化为 0,而aa.b
由于上述子句,将隐式初始化为 0。