Explication détaillée de la distribution de l'espace mémoire en langage C

L'espace mémoire du langage C est divisé en les 5 blocs suivants :

Segment BSS : (segment bss) fait généralement référence à une zone mémoire utilisée pour stocker des variables globales non initialisées dans le programme . BSS est l'abréviation de l'anglais Block Started by Symbol. Le segment BSS est une allocation de mémoire statique.

Segment de données : Le segment de données fait généralement référence à une zone mémoire utilisée pour stocker les variables globales initialisées dans le programme. Le segment de données est une allocation de mémoire statique.
Segment de code :  le segment de code (segment de code/segment de texte) fait généralement référence à une zone mémoire utilisée pour stocker le code d'exécution du programme . Le code dans cette zone est en lecture seule . Dans les extraits de code, les constantes de chaîne appartiennent également à cette section.
Heap : Le tas est utilisé pour stocker des segments de mémoire alloués dynamiquement lors de l'exécution du processus. Sa taille n'est pas fixe et peut être étendue ou réduite dynamiquement.
Pile (stack)  : La pile est également appelée pile. En plus de stocker les variables locales du programme , la pile sert à passer des paramètres et à renvoyer des valeurs lorsqu'une fonction est appelée. En raison de la fonction premier entré, dernier sorti de la pile, la pile est particulièrement pratique pour sauvegarder/restaurer la scène d'appel.
Jetons un coup d'œil à ces 5 parties à travers une capture d'écran dans le livre "Programmation avancée dans un environnement UNIX" :

Le côté gauche est la structure organisationnelle interne du fichier exécutable sous le système UNIX/LINUX, et le côté droit est la division du fichier exécutable dans l'espace d'adressage logique du processus (c'est-à-dire la mémoire). 


La première est la zone de pile (stack).La pile est automatiquement allouée et libérée par le compilateur pour stocker les valeurs des paramètres de fonction, les valeurs des variables locales, etc. Il fonctionne comme une pile dans une structure de données. L'application pour la pile est automatiquement allouée par le système. Par exemple, demandez une variable locale int h à l'intérieur de la fonction. En même temps, il est jugé si l'espace appliqué est inférieur à l'espace restant de la pile. Si cela est inférieur à l'espace restant de la pile, créez de l'espace pour cela dans la pile afin de fournir de la mémoire au programme. Sinon, une exception sera signalée indiquant un débordement de pile.    

Vient ensuite le tas. Le tas 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 d'exploitation à la fin du programme. Notez qu'il est différent du tas dans la structure de données et que la méthode d'allocation est similaire à une liste chaînée. L'application de tas est gérée par le programmeur lui-même. La fonction malloc est utilisée en C et l'opérateur new est utilisé en C++. Cependant, le processus d'application de tas est plus compliqué : lorsque le système reçoit l'application du programme, elle parcourt et enregistrez l'adresse mémoire libre. liste chaînée pour trouver le premier nœud de tas avec un espace plus grand que l'espace demandé, puis supprimez le nœud de la liste chaînée des nœuds libres et allouez l'espace du nœud au programme. Il convient de noter ici qu'il en sont quelques-uns Dans ce cas, la première adresse du bloc mémoire nouvellement appliqué enregistre la taille du bloc mémoire allouée cette fois, afin que l'espace mémoire puisse être libéré correctement lors de la suppression, en particulier delete[].

Vient ensuite la zone de données globales (zone statique) (statique). Les variables globales et les variables statiques sont stockées ensemble. Les variables globales initialisées et les variables statiques se trouvent dans une zone, et les variables globales non initialisées et les variables statiques non initialisées se trouvent dans la même zone. Une autre zone adjacente zone. De plus, dans la zone de texte constante, des chaînes constantes sont placées ici et sont libérées par le système une fois le programme terminé. Enfin, il y a la zone de code du programme, qui contient le code binaire du corps de la fonction.

Donnons un exemple :

int a = 0;                 // 全局初始化区
char *p1;                  // 全局未初始化区 


int main()
{
        int b;                     // 栈
        char s[] = "abc";          // 栈
        char *p2;                  // 栈
        char *p3 = "123456";       // 123456 在常量区,而 p3 在栈上

        static int c =0;          // 全局(静态)初始化区 

        p1 = (char *)malloc(10);

        p2 = (char *)malloc(20);  // 分配的10和20字节的区域就在堆区

        strcpy(p1, "123456");     // 123456 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

        return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/gzg1500521074/article/details/50444845
conseillé
Classement