内存四区(详细)

发布于:2022-12-30 ⋅ 阅读:(387) ⋅ 点赞:(0)

内存四区从低位到高位;代码区(text),数据区(bss,data,rodata),堆区(heap),栈区(stack)      内核空间                                                                                                                                                                                                                                                                                    数据区 的bss,data,rodata(read-only data) ,三个小区域的地址具体高低没有证明,

 

 

 一、代码区

         存放函数体的二进制代码,由操作系统进行管理。

        代码区的代码是只读共享的,利于程序调用执行,并防止修改

二、数据区

        bss段:存放未初始化的静态变量(全局与局部)以及初始化为0的静态变量(全局、局部)

                      未初始化的全局变量和初始化为0 的全局变量

                       未初始化的全局常量

        data段:初始化非0的静态变量(全局,局部)

                       初始化非0的全局变量

        rodata段:初始化为0 的全局常量,初始化非0的全局常量

三、堆区

        堆区的内存是动态的,与栈区没有明显的分界线        

        用 malloc函数 或 new 关键字 向堆区申请空间,手动申请,手动释放

四、栈区

        也是动态的,在程序运行时,由编译器自动分配内存空间

        存放函数的参数值,局部变量,局部常量

五、证明

编写各类型数据(以int 为例,字符串的当时忘记了,数据量较少,没有办法证明数据区三段的具体地址高低)

运行结果

并objdump   -t   反汇编到a.txt文件查看数据所处内存区段

#include <stdio.h>
int ninit_g_a;
int init_g_0a = 0;
int init_g_1a = 1;
const int const_g_b;
const int const_g_0b = 0;
const int const_g_1b = 1;
static int static_g_c;
static int static_g_0c = 0;
static int static_g_1c = 1;

int main()
{
    static int static_l_d;
    static int static_l_0d = 0;
    static int static_l_1d = 1;
    const int const_l_e;
    const int const_l_0e = 0;
    const int const_l_1e = 1;
    int ninit_l_f;
    int init_l_0f = 0;
    int init_l_1f = 1;
    printf("未初始化普通全局变量ninit_g_a = %p\n", &ninit_g_a); // g - global 全局 ; l - local 局部
    printf("初始化为0的普通全局变量init_g_0b = %p\n", &init_g_0a);
    printf("初始化非0的普通全局变量init_g_c = %p\n", &init_g_1a);
    printf("\n");
    printf("未初始化全局常量const_g_b = %p\n", &const_g_b);
    printf("0全局常量const_g_0b = %p\n", &const_g_0b);
    printf("1全局常量const_g_1b = %p\n", &const_g_1b);
    printf("\n");
    printf("未初始化静态全局变量static_g_c = %p\n", &static_g_c);
    printf("0静态全局变量static_g_0c = %p\n", &static_g_0c);
    printf("1静态全局变量static_g_1c = %p\n", &static_g_1c);
    printf("\n");
    printf("未初始化普通局部变量ninit_l_f = %p\n", &ninit_l_f);
    printf("0普通局部变量init_l_0f = %p\n", &init_l_0f);
    printf("1普通局部变量init_l_1f = %p\n", &init_l_1f);
    printf("\n");
    printf("未初始化局部常量const_g_b = %p\n", &const_l_e);
    printf("0局部常量const_g_0b = %p\n", &const_l_0e);
    printf("1局部常量const_g_1b = %p\n", &const_l_1e);
    printf("\n");
    printf("未初始化静态局部变量static_g_c = %p\n", &static_l_d);
    printf("0静态局部变量static_g_0c = %p\n", &static_l_0d);
    printf("1静态局部变量static_g_1c = %p\n", &static_l_1d);
    return 0;
}