2010-10-07 31 views
2

J'utilisé pour initialiser mes structures de cette façon:Type d'initialisation éparse pour les structures, toutes les ressources?

struct A a = {0}; 

Cela semble fonctionner pour moi, mais je disputai sur ANSI C, C89, C99 norme.
Simplement je ne pouvais pas trouver cela dans toute la documentation.
Pourriez-vous m'aider?
Voici un exemple qui fonctionne pour '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: 

Celui-ci montre qu'il initialize d'abord avec 1, reste des 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 

Répondre

2

Vous avez raison, cela fonctionne toujours. La section pertinente dans le projet C99 N1256 est 6.7.8 (Initialisation):

21. S'il y a moins initializers dans une liste fermée accolades que il y a des éléments ou des membres d'un agrégat ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue qu'il n'y a d'éléments dans le tableau, le reste de l'agrégat doit être initialisé implicitement de la même manière que les objets ayant une durée de stockage statique.

objets de durée de stockage statique sont initialisés à zéro (point 10 de la même section).

La norme ANSI est plus courte, mais similaire à 3.5.7:

S'il y a moins initializers dans une liste que certains membres de un agrégat, le reste de l'agrégat doivent être initialisées implicitement Identique aux objets ayant une durée de stockage statique.