Partager via


Initialiser les types globaux

un type « global » est une structure, une union, ou un type de tableau.Si un type d'agrégat contient des membres de types globaux, les règles d'initialisation s'appliquent de manière récursive.

Syntaxe

  • initialiseur:
    liste d'initialiseurs de**{** } /* pour l'initialisation d'agrégats *

    liste d'initialiseurs ,}de**{**

  • liste d'initialiseurs:
    initialiseur

    initialiseur deServeur IIS local deliste d'initialiseurs

La liste d'initialiseurs est une liste d'initialiseurs d'objets séparés par des virgules.Chaque initialiseur de la liste est une expression constante ou une liste d'initialiseurs.Par conséquent, les listes d'initialiseurs peuvent être imbriquées.Ce formulaire est utile pour initialiser des membres globaux d'un type d'agrégat, comme indiqué dans les exemples de cette section.Toutefois, si l'initialiseur d'un identificateur automatique est une expression unique, il n'a pas besoin d'être une expression constante ; il doit simplement avoir le type approprié pour l'assignation à l'identificateur.

Pour chaque liste d'initialiseurs, les valeurs des expressions constantes sont assignées, dans l'ordre, aux membres correspondants de la variable globale.

Si la liste d'initialiseurs comporte moins de valeurs qu'un type global, les membres ou les éléments restants du type d'agrégat sont initialisés à 0.La valeur initiale d'un identificateur automatique pas initialisé explicitement est pas définie.Si la liste d'initialiseurs a plus de valeurs qu'un type global, les résultats des erreurs.Ces règles s'appliquent à chaque liste d'initialiseurs incorporée, ainsi qu'à l'agrégat dans son ensemble.

L'initialiseur d'une structure est une expression du même type, ou une liste d'initialiseurs pour ses membres placés entre les accolades ().Les membres sans nom de champ de bits ne sont pas initialisé.

Lorsqu'une union est initialisée, la liste d'initialiseurs doit être une expression constante unique.la valeur de l'expression constante est assignée au premier membre de l'union.

Si un tableau a une taille inconnue, le nombre d'initialiseurs détermine la taille du tableau, et son type est terminé.Il n'existe aucun moyen de spécifier la répétition d'un initialiseur en C, ou d'initialiser un élément au milieu d'un tableau sans fournir des valeurs précédentes également.Si vous avez besoin de cette opération dans votre programme, entrez la routine en langage assembleur.

Notez que le nombre d'initialiseurs peut définir la taille du tableau :

int x[ ] = { 0, 1, 2 }

Si vous spécifiez la taille et donnez un nombre erroné d'initialiseurs, toutefois, le compilateur génère une erreur.

Spécifique à Microsoft

La taille maximale pour un tableau est définie par size_t.défini dans le fichier d'en-tête STDDEF.H, size_t est unsigned int avec la plage 0x00000000 à 0x7CFFFFFF.

détail de FIN Microsoft

Exemples

Cet exemple montre des initialiseurs d'un tableau.

int P[4][3] = 
{
    { 1, 1, 1 },
    { 2, 2, 2 },
    { 3, 3, 3,},
    { 4, 4, 4,},
};

Cette instruction déclare P en tant que quatre-par-trois tableau et initialise les éléments de sa première ligne à 1, les éléments de la deuxième ligne à 2, etc. via la quatrième ligne.Notez que la liste d'initialiseurs pour la troisième et quatrième lignes contient des virgules après la dernière expression constante.la dernière liste d'initialiseurs ({4, 4, 4,},) est également suivie par une virgule.ces virgules supplémentaires sont autorisées mais ne sont pas requises ; uniquement virgules qui séparent les expressions constantes les unes des autres, et celles que l'une liste d'initialiseurs séparée des autres, sont obligatoires.

Si un membre global n'a pas de liste d'initialiseurs incorporée, les valeurs sont simplement assignées, dans l'ordre, à chaque membre du sous-agrégat.Par conséquent, l'initialisation dans l'exemple précédent équivaut à ce qui suit :

int P[4][3] = 
{
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};

L'accolade peut également s'affichera autour de différents initialiseurs dans la liste et aidera à clarifier l'exemple ci-dessus.

Lorsque vous initialisez une variable globale, vous devez veiller à utiliser les accolades et les listes d'initialiseurs correctement.L'exemple suivant illustre la traduction du compilateur d'accolades plus en détail :

typedef struct 
{
    int n1, n2, n3;
} triplet;

triplet nlist[2][3] = 
{
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */
};

Dans cet exemple, nlist est déclaré comme 2 3-par-3 un tableau de structures, chaque structure ayant trois membres.la ligne 1 de l'initialisation assigne des valeurs à la première ligne d' nlist, comme suit :

  1. La première accolade ouvrante sur la ligne 1 indique au compilateur que l'initialisation du premier membre global d' nlist (autrement dit, nlist[0]) commence.

  2. La deuxième accolade ouvrante indique que l'initialisation du premier membre global d' nlist[0] (autrement dit, la structure à l'adresse nlist[0][0]) commence.

  3. La première accolade fermante termine l'initialisation de la structure nlist[0][0]; l'accolade ouvrante suivante commence l'initialisation d' nlist[0][1].

  4. Le processus se poursuit jusqu'à la fin de la ligne, où l'accolade fermante fermante termine l'initialisation d' nlist[0].

La ligne 2 assigne des valeurs à la deuxième ligne d' nlist d'une manière similaire.Notez que les ensembles externes d'accolades plaçant les initialiseurs sur les lignes 1 et 2 sont obligatoires.La construction suivante, qui omet l'accolade externe, génère une erreur :

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */
{
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */
};

Dans cette construction, la première accolade ouvrante sur la ligne 1 démarre l'initialisation d' nlist[0], qui est un tableau de trois structures.les valeurs 1, 2, et 3 sont assignées aux trois membres de la première structure.Lorsque l'accolade fermante suivante est produite (après la valeur 3), initialisation d' nlist[0] est terminée, et les deux structures restantes dans le tableau de trois-structure sont automatiquement initialisés à 0.de même, { 4,5,6 } initialise la première structure dans la deuxième ligne d' nlist.Les deux structures restantes d' nlist[1] sont définies à 0.Lorsque le compilateur rencontre la liste d'initialiseurs suivante ({ 7,8,9 }), il tente d'initialiser nlist[2].Étant donné qu' nlist a que deux lignes, les causes de cette tentative une erreur.

Dans cet exemple suivant, les trois membres d' int d' x sont initialisés à 1, à 2, et 3, respectivement.

struct list 
{
    int i, j, k;
    float m[2][3];
} x = {
        1,
        2,
        3,
       {4.0, 4.0, 4.0}
      };

dans la structure d' list ci-dessus, les trois éléments dans la première ligne d' m sont initialisés à 4,0 ; les éléments de la ligne restante de m sont initialisés à 0,0 par défaut.

union
{
    char x[2][3];
    int i, j, k;
} y = { {
            {'1'},
            {'4'} 
        }
      };

l'union yvariable, dans cet exemple, est initialisée.Le premier élément de l'union est un tableau, donc l'initialiseur est un initialiseur global.La liste d'initialiseurs {'1'} assigne des valeurs à la première ligne du tableau.Étant donné qu'une valeur s'affiche dans la liste, l'élément dans la première colonne est initialisé au caractère 1, et les deux éléments restants dans la ligne sont initialisés à la valeur 0 par défaut.De même, le premier élément de la deuxième ligne d' x est initialisé au caractère 4, et les deux éléments restants dans la ligne sont initialisés à la valeur 0.

Voir aussi

Concepts

Initialisation