L'initialisation des variables statiques en C
J'ai une question à propos de l'initialisation des variables statiques dans C. je sais que, si nous déclarons une variable globale statique que par défaut, la valeur est 0
. Par exemple:
static int a; //although we do not initialize it, the value of a is 0
mais que dire de la structure de données suivante:
typedef struct
{
int a;
int b;
int c;
} Hello;
static Hello hello[3];
sont tous les membres de chaque structure de hello[0]
, hello[1]
, hello[2]
initialisé comme 0
?
Vous devez vous connecter pour publier un commentaire.
Oui, tous les membres sont initialisés pour les objets statiques de stockage. Voir 6.7.8/10 dans le Standard C99 (document PDF)
À tout initialiser un objet, si c'est
static
ou pas, à 0, j'aime utiliser le universelle zéro de l'initialiseurIl n'y a pas de partielle de l'initialisation dans C. Un objet est entièrement initialisé (à
0
de la sorte en l'absence d'une valeur différente) ou non initialisé à tous.Si vous voulez partielle de l'initialisation, vous ne pouvez pas initialiser pour commencer avec.
Oui, ils sont, tant qu'ils ont statique ou thread durée de stockage.
Oui, fichier-portée des variables statiques sont initialisées à zéro, y compris tous les membres de structures, tableaux, etc.
Voir cette question de référence (je vais voter pour fermer cette comme un doublon, trop).
Edit: cette question est d'obtenir beaucoup de meilleures réponses, donc je vais voter pour fermer que question comme un double de ce, à la place.
Pour référence, voici la C lien de la FAQ à partir de cette question accepté de répondre, même si bien sûr, la C99 et C11 des normes liées voici canonique.
Je voudrais ajouter que les variables statiques (ou tableaux) sont classés en deux types.
Initialisé sont ceux qui sont donnés à la valeur de code au moment de la compilation. Ce sont généralement stockés dans DS si c'est le compilateur spécifique.
L'autre type est non initialisée statique qui ne sont initialisés au moment de l'exécution et sont stockées dans le segment BSS bien qu'encore une fois c'est le compilateur spécifique.
SEV