Вид редкой инициализации для структур, любых ресурсов?

StackOverflow https://stackoverflow.com/questions/3879960

Вопрос

Я использовал для инициализации своих структур таким образом:

struct A a = {0};

Похоже, это работает для меня, однако я утверждал об ANSI C, C89, C99 Standard.
Просто я не мог найти это в любой документации.
Не могли бы вы помочь мне с этим?
Вот пример, что это работает для «CL» (VS Express 2008).

#include <stdio.h>
struct DATA
{
    int a;
    int b;
    char tab[3];
};


int main(void)
{
    struct DATA A;
    struct DATA B = {0};

    printf("A.a: %d, A.b: %d, A.tab: %s\n", A.a, A.b, A.tab);
    printf("B.a: %d, B.b: %d, B.tab: %s", B.a, B.b, B.tab);
};
>>>>>OUTPUT:
D:\N\workspace>test.exe

A.a: 4203600, A.b: 451445257, A.tab: ■   
B.a: 0, B.b: 0, B.tab:

Этот показывает, что он инициализируется первым с 1, отдых с 0.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int a;
    int b;
} ASDF;

ASDF A = {1};

int main()
{
    printf("a:%d,b:%d\n",A.a,A.b);
    return 0;
}
Output:
a:1,b:0
Это было полезно?

Решение

Вы правы, это всегда работает. Соответствующий раздел в проекте C99 N1256 составляет 6,7,8 (инициализация):

21. Если есть меньше инициализаторов в прилагаемом сковороде, чем есть элементы или члены совокупности или меньшего количества символов в строковом литерате, используемом для инициализации массива известного размера, чем в массиве, остальная часть совокупности должна Быть неявно инициализированным таким же, как объекты, которые имеют статическую продолжительность хранения.

Объекты статической длительности хранения инициализируются до нуля (пункт 10 того же сечения).

Стандарт ANSI короче, но похоже в 3.5.7:

Если в списке есть меньше инициализаторов, чем есть члены совокупности, остаток совокупности должен быть неявно инициализируется таким же, как объекты, которые имеют статическую продолжительность хранения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top