在正式接触linux系统编程前我在这个章节主要介绍c程序在计算机当中的存储状态,作为一名合格c程序员就必须去了解内存,下面让我们一起来了解c程序计算机的内存中的分布状态。
上图就清晰的表示了c程序在内存当中的分布状态,
text文本段:
从内存空间低地址开始存放的为c程序代码,也称代码段、正文段,在程序运行过程中由磁盘加载到内存当中。
radata只读数据段:
radata为只读数据段,存放只读属性的变量,如常量和const声明的变量等。
Initdata初始化数据段:
Initdata为初始化过的可读可写的变量。
.bss未初始化数据段
bss段表示未初始化的变量,存放程序当中未初始化的变量。
heap堆:
heap堆是由malloc,new申请的空间,由程序员自行申请释放,在申请后要进行free释放。
stack栈:
stack栈空间是函数执行过程中产生的临时变量以及函数参数等,栈由系统自行进行分配与释放,栈申请空间由上向下。
下面我们用一段c—demo表示一下其存储位置。
#include <stdio.h>
#define PI = 3.1415 //常量 .radata只读数据区
int a = 0; //.Initdata初始化数据段
char *p1; //.bss段未初始化数据段
static a1 = 0; //.静态存储区-Initdata段
const int a2 = 10; //.radata只读数据段
int main(int argc, char *argv[])
{
int b; // 栈
char s[]="aaa"; //栈
char *p; //栈
char *str = "123456"; //str存放在栈上 "123456\0"存放在常量区-.radata段
static int a2; //全局静态存储区-.bss段
p = (int *)malloc(sizeof(int *)); //堆空间
free(p); //释放p空间
return 0;
}
上面的图片和demo清晰的表达了c程序在内存当中的空间分配,大家可以结合理解。