c程序内存结构

参考博客:https://www.cnblogs.com/helloworld8102/p/9682592.html  

                 https://blog.csdn.net/weixin_39540568/article/details/88363212

       一个可执行C程序在内存中主要包含5个区域别是代码段(text),数据段(data),BSS段,堆段(heap)和栈段(stack)。其中前三个段(text,data,bss)是程序编译完成就存在的,此,分时程序并未载入内存进行执行。后两个段(heap,stack)是程序被加载到内存中时,才存在的

代码段:就是C程序编译后的机器指令,也就是我们常见的汇编代码

数据段(data):用来存放显式初始化的全局变量或者静态(全局)变量。

BSS段(Block Started by Symbol):存储未初始化的全局变量或者静态(全局)变量。

Heap:堆&&Stack:栈两者都是动态分配内存,两者空间大小都可变,每个线都会有自己的栈程,但是堆空间是共用的。但是堆和栈是两个不同的区域。

  1. 栈段(stack):存放函数调用相关的参数、局部变量的值,以及在任务切换的上下文信息。具有空间小,速度快,自由性差,用来保存程序局部变量,Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M,总之是一个编译时就确定的常数) 如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小)

 

  1. Heap:堆,自由申请空间,按照内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 动态分配的内存在调用malloc(),不用的时候必须free,并指向NULL堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表 的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大

                                                    

小结:对于C代码编译出来的二进制,代码段(text)、数据段(data)和BSS段是代码编译后就确定了,但是编译后的程序存储在硬盘中,当要执行的的时候,操作系统负责将该程序load到内存中。在程序运行的之后,就会涉及到堆区和栈区的操作。一般情况下,堆区是向上生长的,栈区是向下生长的,当然不同的处理器架构是不同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值