C程序的存储空间布局

系统空间:

为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。
内核总是驻留在内存中,是操作系统的一部分。
系统中所有进程对应的虚拟地址空间的内核区都会映射到同一块物理内存上(系统内核只有一个)。

命令行参数区:

存储进程执行的时候传递给 main() 函数的参数,argc,argv []。

环境变量: 

存储和进程相关的环境变量,比如:工作路径,进程所有者等信息

栈(stack):

存储函数内部声明的非静态局部变量,函数参数,函数返回地址等信息,栈内存由编译器自动分配释放。栈和堆相反地址 “向下生长”,分配的内存是连续的。

内存映射区(mmap):

位于堆空间和栈空间之间

作为内存映射区加载磁盘文件,或者加载程序运作过程中需要调用的动态库。

堆(heap):

用于存放进程运行时动态分配的内存。
堆中内容是匿名的,不能按名字直接访问,只能通过指针间接访问。
堆向高地址扩展 (即 “向上生长”),是不连续的内存区域。这是由于系统用链表来存储空闲内存地址,自然不连续,而链表从低地址向高地址遍历。

.bss段:

未初始化以及初始为 0 的全局变量和静态变量,操作系统会将这些未初始化变量初始化为 0

.data段:

数据段通常用于存放程序中已初始化且初值不为 0 的全局变量和静态变量。数据段属于静态内存分配 (静态存储区),可读可写。

.rodata:

只读存储区,一般存放字符串常量、const修饰的变量...

.text段:

代码段也称正文段或文本段,通常用于存放程序的执行代码 (即 CPU 执行的机器指令),代码段一般情况下是只读的,这是对执行代码的一种保护机制。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值