我是靠谱客的博主 会撒娇世界,最近开发中收集的这篇文章主要介绍Linux进程的虚拟内存区域划分,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Linux进程的虚拟内存区域分为:代码区、只读常量区、全局区、BSS段、堆区、栈区

代码区:存储功能代码,函数名所在的区域

只读常量区:存放字符串常量,以及const修饰的全局变量

全局区/数据区:存放已经初始化的全局变量和已经初始化用static修饰的局部变量

BSS段:存放没有初始化的全局变量和未初始化静态局部变量,该区域会在main函数执行前进行自动清零

堆区:使用malloc/new free/delete函数处理的内存,该区域的内存需要程序员手动申请和释放

栈区:存放局部变量(包括函数的形参),const修饰的局部变量以及块变量,该区域的内存由操作系统负责分配和回收,程序员尽管放心使用

注意:栈区和堆区之间并没有严格分割线,可以进行微调,并且堆区分配一般从低地址到高地址分配,而栈区分配一般从高地址到低地址分配

 

可以通过以下代码来验证以上Linux进程的虚拟内存区域划分

//进程中内存区域的划分
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int i1 = 10; //全局区
int i2 = 20; //全局区
int i3;     //BSS段
const int i4 = 40;//只读常量区

void fn(int i5) //栈区
{
    int i6 = 60;//栈区
    static int i7 = 70;//全局区
    const int i8 = 80; //栈区
    int* p1 = (int*)malloc(sizeof(int));//堆区
    int* p2 = (int*)malloc(sizeof(int));//堆区
    char* str = "good";//只读常量区
    char strs[] = "good";//栈区

    printf("只读常量区:&i4 = %pn",&i4);
    printf("只读常量去:str = %pn",str);

    printf("---------------------n");
    printf("全局区:&i1 = %pn",&i1);
    printf("全局区:&i2 = %pn",&i2);
    printf("全局区:&i7 = %pn",&i7);

    printf("---------------------n");
    printf("BSS段:&i3 = %pn",&i3);

    printf("---------------------n");
    printf("堆区:p1 = %pn",p1);
    printf("堆区:p2 = %pn",p2);

    printf("---------------------n");
    printf("栈区:&i5 = %pn",&i5);
    printf("栈区:&i6 = %pn",&i6);
    printf("栈区:&i8 = %pn",&i8);
    printf("栈区:strs = %pn",strs);
}


int main(void)
{
    printf("代码区:fn = %pn",fn);

    printf("-----------------------n");
    fn(10);
    return 0;
}

执行结果如下:

代码区:fn = 0x40062d
-----------------------
只读常量区:&i4 = 0x400884
只读常量去:str = 0x400888
---------------------
全局区:&i1 = 0x601058
全局区:&i2 = 0x60105c
全局区:&i7 = 0x601060
---------------------
BSS段:&i3 = 0x601068
---------------------
堆区:p1 = 0x1d9b010
堆区:p2 = 0x1d9b030
---------------------
栈区:&i5 = 0x7ffd409525ec
栈区:&i6 = 0x7ffd409525f0
栈区:&i8 = 0x7ffd409525f4
栈区:strs = 0x7ffd40952610

转载于:https://www.cnblogs.com/fah936861121/p/6878699.html

最后

以上就是会撒娇世界为你收集整理的Linux进程的虚拟内存区域划分的全部内容,希望文章能够帮你解决Linux进程的虚拟内存区域划分所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部