初始化结构的第一个元素或整个结构?

时间:2013-03-15 09:58:26

标签: c gcc

所有:
        用C语言:

struct A  
{
    int a;
    int b;
};

A aa = {0};  

此语句仅初始化aa.a或初始化整个结构?或者行为取决于编译器?
提前谢谢!

4 个答案:

答案 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,因为上面的条款。