"struct a a1 = {0};" 不同于"struct a a2 = {5};" 为什么?

San*_*raj 4 c struct

如果struct a a1 = {0};将结构的所有元素(不同类型)struct a a2 = {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;
}
Run Code Online (Sandbox Code Playgroud)

未初始化的结构包含垃圾值

a0.i = 134513937
a0.j = 134513456
a0.k = 0 
Run Code Online (Sandbox Code Playgroud)

initialized to 0struct包含初始化为的所有元素0

a1.i = 0 
a1.j = 0 
a1.k = 0 
Run Code Online (Sandbox Code Playgroud)

初始化为5struct只包含初始化为的第一个元素5和初始化为的其余元素0.

a2.i = 5 
a2.j = 0 
a2.k = 0
Run Code Online (Sandbox Code Playgroud)

a2.ja2.k始终保证初始化0期间a a2 = {5};(或)是一个undefined behavior

OTOH,为什么我没有看到s2初始化的所有元素5.如何在struct初始化期间完成初始化{0}以及如何{5}使用它?

Alo*_*ave 10

参考:

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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,i具有自动存储功能,并且由于未显式初始化,因此其值为Undefined.
虽然j具有静态存储持续时间,但保证0由编译器初始化.


Gun*_*iez 8

省略的值将始终初始化为零,因为标准说明了这一点.所以你基本上有

struct a a1 = { 0, 0, 0 };
Run Code Online (Sandbox Code Playgroud)

struct a a2 = { 5, 0, 0 };
Run Code Online (Sandbox Code Playgroud)

这当然是不同的.