Variable locale en langage C et limite de taille de variable globale

Lors de l'écriture d'un programme, j'ai trouvé un problème selon lequel un grand tableau ne peut pas utiliser de variables locales. Des variables globales doivent être utilisées. En résumé, j'ai trouvé ce bon article du blogueur, collection!

Voir le code

#include <stdio.h>
int main () {
int a [1000000]; // variable locale
return 0;
}

Une erreur de débordement a été trouvée après la compilation et l'exécution.

#include <stdio.h>
int a [1000000]; // Variable globale
int main () {
return 0;
}

Compilez et exécutez normalement.

Avant d'expliquer les raisons, regardons la mémoire occupée par un programme compilé par C / C ++ divisé en plusieurs parties:

1. Segment de pile (segment de pile): alloué et libéré automatiquement par le compilateur, stockant les valeurs des paramètres de fonction et des variables locales. Sous Windows, la pile est une structure de données qui se développe à une adresse inférieure et est une zone de mémoire continue. Cette phrase signifie que l'adresse du haut de la pile et la capacité maximale de la pile sont prédéterminées par le système. Sous WINDOWS, la taille de la pile est de 2 Mo (certaines sont de 1 Mo, bref, une constante déterminée au moment de la compilation). Lorsque l'espace dépasse l'espace restant sur la pile, un débordement sera demandé. Par conséquent, l'espace disponible à partir de la pile est petit.

2. Segment de segment: il est généralement alloué et libéré par le programmeur. Si le programmeur ne le libère pas, il peut être récupéré par le système à la fin du programme. Il est différent du tas dans la structure de données. Le tas est une structure de données qui s'étend à des adresses plus élevées et est une zone de mémoire discontinue. Cela est dû au fait que le système utilise la liste chaînée pour stocker l'adresse de mémoire libre, qui est naturellement discontinue, et la direction de parcours de la liste chaînée va de l'adresse basse à l'adresse haute. La taille du tas est limitée par la mémoire virtuelle disponible dans le système informatique. Cela montre que l'espace obtenu par le tas est plus flexible et plus grand.

3. Segment global (segment statique) (segment de données): La zone de stockage des variables globales et des variables statiques est ensemble et est libérée par le système après la fin du programme. La taille de la zone de données est limitée par le système et est généralement grande.

4. Zone constante littérale: des chaînes constantes sont placées ici et sont libérées par le système après la fin du programme.

5. Zone de code de programme: stockez le code binaire du corps de la fonction.

Pour résumer, l'espace variable local est très petit, nous ouvrons un [1000000] provoquera un débordement de pile, et l'espace variable global peut atteindre 4 Go sous Win 32 bits, donc il ne débordera pas.

Je suppose que tu aimes

Origine www.cnblogs.com/silver-aircraft/p/12728363.html
conseillé
Classement