所有:
用C语言:
struct A
{
int a;
int b;
};
A aa = {0};
此语句仅初始化aa.a或初始化整个结构?或者行为取决于编译器?
提前谢谢!
答案 0 :(得分:4)
One more ex:
struct A
{
int a;
int b;
};
struct A aa = {5};
这将初始化整个结构,但aa.b将初始化为0。 如果只初始化一个结构的少数成员,那么其中所有其他成员将自动初始化为0.
答案 1 :(得分:1)
根据C99标准第6.7.8.17节,只有第一个成员(按照声明顺序,即a
字段)在您的示例中明确初始化:
每个大括号括起的初始化列表都有一个关联的当前对象。当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员。
通过“指定”,标准意味着
A aa = {.b = 0};
这是让程序员决定初始化哪些字段的更精确方法。
答案 2 :(得分:1)
此语句仅初始化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);
}
答案 3 :(得分:1)
来自标准(N1570)
6.7.9初始化
...
10如果未显式初始化具有自动存储持续时间的对象,则其值为 不定。如果未初始化具有静态或线程存储持续时间的对象 明确地,然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员, 并且任何填充都初始化为零位;
- 如果它是一个联合,则根据这些命名初始化(递归)第一个命名成员 规则,任何填充都初始化为零位;
...
21如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
因此,在你的例子aa.a
将被明确地初始化为0,由于初始值设定,而aa.b
将被隐含地初始化为0,因为上面的条款。