C &引用;结构a1={0}&引用;不同于;结构a a2={5}&引用;为什么?

C &引用;结构a1={0}&引用;不同于;结构a a2={5}&引用;为什么?,c,struct,C,Struct,如果structaa1={0}将结构的所有元素(不同类型)初始化为零,然后structaa2={5}应将其初始化为5。。没有 #include <stdio.h> typedef struct _a { int i; int j; int k; }a; int main(void) { a a0; a a1 = {0}; a a2 = {5}; printf("a0.i = %d \n", a0.i); print

如果
structaa1={0}将结构的所有元素(不同类型)初始化为零,然后
structaa2={5}应将其初始化为
5
。。没有

#include <stdio.h>

typedef struct _a {
    int i;
    int j;
    int k;
}a;

int main(void)
{
    a a0;
    a a1 = {0};
    a a2 = {5};

    printf("a0.i = %d \n", a0.i);
    printf("a0.j = %d \n", a0.j);
    printf("a0.k = %d \n", a0.k);

    printf("a1.i = %d \n", a1.i);
    printf("a1.j = %d \n", a1.j);
    printf("a1.k = %d \n", a1.k);

    printf("a2.i = %d \n", a2.i);
    printf("a2.j = %d \n", a2.j);
    printf("a2.k = %d \n", a2.k);

    return 0;
}
初始化为
0
结构包含所有初始化为
0

a1.i = 0 
a1.j = 0 
a1.k = 0 
初始化为
5
结构只包含初始化为
5
的第一个元素和初始化为
0
的其余元素

a2.i = 5 
a2.j = 0 
a2.k = 0
a2.j
a2.k
a2={5}期间总是保证初始化为
0
(或)这是一种
未定义的行为


OTOH,为什么我没有看到
s2
的所有元素都初始化为
5
。在
{0}
期间,
结构如何初始化?使用
{5}
时有什么不同?

忽略的值将始终初始化为零,因为标准如此规定。所以你基本上

struct a a1 = { 0, 0, 0 };


这当然不同。

否。在C中,如果初始值设定项列表不完整,所有缺少的索引都将用0填充。因此:

int a[3] = {0};
int b[3] = {5};
实际上成为:

int a[3] = {0, 0, 0};
int b[3] = {5, 0, 0};
这就是为什么它似乎与
{0}
一起工作,但与
{5}
一起失败的原因。参考:

C99标准6.7.8.21

如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同

[编辑]

静态对象和隐式初始化:

对象的存储持续时间决定了对象的生存期。
有3个存储持续时间:
静态、自动和已分配

在所有块之外声明的变量和使用静态存储类说明符显式声明的变量具有。默认情况下,编译器将静态变量初始化为零

考虑以下计划:

#include<stdio.h>

int main()
{
    int i;
    static int j;
    printf("i = [%d]",i);
    printf("j = [%d]",j);

    return 0;
}
#包括
int main()
{
int i;
静态int j;
printf(“i=[%d]”,i);
printf(“j=[%d]”,j);
返回0;
}
在上面的程序中,
i
具有自动存储功能,由于未显式初始化,其值为未定义
j
具有静态存储持续时间,并且保证编译器将其初始化为
0

这对我不起作用

struct x {
    int *y;
    /* ... */
};

struct x xobj = {5};

请查看GCC文档。

这两种情况下的行为完全相同。如果初始值设定项少于聚合中的元素,则剩余的元素将被初始化,就像它们被声明为
static
,这意味着它们将被初始化为0或NULL

只是在第一种情况下,显式初始值设定项与隐式初始值设定项具有相同的值

如果要将聚合的所有元素初始化为0以外的值,则必须为每个元素提供显式初始化器,即:

a a2 = {5, 5, 5};

+1用于引用标准。但为了完整性,也许您应该澄清静态对象是如何隐式初始化的。@OliCharlesworth,这确实很有趣。使用
{}
并且永远不允许使用“未初始化”的结构似乎是一种很好的做法<代码>结构a3={}这有意义吗?@AaronMcDaid:C出于效率原因允许未初始化的变量。@AaronMcDaid:注意,根据标准,初始化器列表必须为非空。@OliCharlesworth:Done。有点笨拙,但我希望能为新用户提供一个基本的理解。”…应该将其初始化为5..no?!“简短回答:不,很好!”。。谢谢分享+1重要的是,它是一个特定于gcc的编译器扩展,使用它可以使代码在编译器之间不可移植。
struct x {
    int *y;
    /* ... */
};

struct x xobj = {5};
a a2 = {5, 5, 5};