Вид разреженной инициализации для структур, какие-то ресурсы? - PullRequest
2 голосов
/ 07 октября 2010

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

struct A a = {0};

Кажется, это работает для меня, однако я спорил о стандартах ANSI C, C89, C99. Просто я не смог найти это ни в одной документации.
Не могли бы вы помочь мне с этим?
Вот пример того, что это работает для '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

1 Ответ

2 голосов
/ 07 октября 2010

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

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

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

Стандарт ANSI короче, но аналогичен в 3.5.7:

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

...