C程序的内存空间是如何分布的

在这里插入图片描述

什么是程序?什么是进程?

了解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函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。

当这个进程结束时,操作系统会释放之前分配给这个进程的资源和内存,并将新的数据写入磁盘,以待下次运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值