内存四区从低位到高位;代码区(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;
}