什么是程序?什么是进程?
了解C程序的空间分配,先了解一下什么是程序,什么是进程,看一条指令
gcc tese.c -o pro
这就是gcc编译test.c, -o生成一个可执行性文件叫pro
./pro会运行这个可执行性文件,pro跑起来就是一个进程,此时系统之中就会多一个进程
程序是静态的
进程是动态的 进程是程序的一次运行,简单说就是程序跑起来了
ps和top都可以查看当前系统中的进程运行状态
C程序的空间分布
当一个进程跑起来的时候,操作系统会给这个进程分配一块内存空间,这块内存会存储该程序的不同内容
这块内存一共会被划分为5个不同的分区,如下
正文段(代码段)
官方话:这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其自身的指令。
我的理解:正文段一般存储是此程序的是核心代码和一些逻辑算法,如上图中右侧if else这部分
初始化数据段(数据段)
通常将此段称为数据段,它包含了程序中需明确地赋初值的变量。例如, C程序中出现在任何函数之外的声明:int maxcount=99: 使此变量带有其初值存放在初始化数据段中。
非初始化数据段(bss段)
通常将此段称为bss段,这一名称来源于一个早期的汇编运算符,意思是“block started by symbol”(由符号开始的块),在程序开始执行之前,内核将此段中的数据初始化为0或空指针。出现在任何函数外的C声明,比如:
long sum[1000];
使此变量存放在非初始化数据段中,未完成初始化的变量都会存储在这里
堆
通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和 栈之间。
就是malloc和calloc开辟的空间
栈
自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。