Il est impossible de dire avec certitude sans connaître l'implémentation spécifique à laquelle vous avez affaire. Dans certains cas, static int i=0;
sera stocké dans un segment de données initialisé car vous avez fourni un initialiseur. Dans d'autres cas, le BSS sera initialisé de toute façon, de sorte que l'éditeur de liens le mettra de toute façon à zéro. Si vous avez spécifié une valeur différente (par exemple, static int i=12345;
), vous obtiendrez une bien meilleure garantie de son placement dans un segment de données initialisé.
extern
ne détermine pas vraiment où le lieur placera la variable. C'est à peu près comme ci-dessus: si l'éditeur de liens sait (ou arrange) que BSS est initialisé à zéro, alors quelque chose qui est extern avec aucun initialiseur spécifié peut être dans BSS. Si BSS n'est pas initialisé à zéro, il doit normalement se trouver dans un segment de données initialisé.
register
est fondamentalement équivalent à auto
- ils sont tous les deux alloués à l'exécution, typiquement dans un registre ou dans la pile.
En ce qui concerne la vérification, cela devient encore plus dépendant de l'implémentation individuelle. Vous découvrirez généralement en regardant quelque chose comme un fichier de carte de liaison; Si vous voulez le comprendre par vous-même, cela impliquera très probablement de regarder soit le format de symbole utilisé, soit de spéléo les internes du format exécutable pour votre système.
Chose amusante: downvotes + favoris. Je suppose que cela signifie "Je ne sais pas la réponse mais je n'aime pas la façon dont vous posez votre question" :) –
@Armen Tsirunyan - Nah, juste plus de gens avec les mêmes devoirs. – Ishtar
Les termes BSS et segment de données initialisé n'ont aucun sens en C. Le standard de langage laisse entièrement à l'implémentation le soin de décider où placer les variables de différentes classes de stockage. – JeremyP