c程序内存结构
参考博客:https://www.cnblogs.com/helloworld8102/p/9682592.html
https://blog.****.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:栈两者都是动态分配内存,两者空间大小都可变,每个线都会有自己的栈程,但是堆空间是共用的。但是堆和栈是两个不同的区域。
- 栈段(stack):存放函数调用相关的参数、局部变量的值,以及在任务切换的上下文信息。具有空间小,速度快,自由性差,用来保存程序局部变量,在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M,总之是一个编译时就确定的常数), 如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小)
- Heap:堆,自由申请空间,按照内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 动态分配的内存在调用malloc(),不用的时候必须free,并指向NULL。堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表 的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大
小结:对于C代码编译出来的二进制,代码段(text)、数据段(data)和BSS段是代码编译后就确定了,但是编译后的程序存储在硬盘中,当要执行的的时候,操作系统负责将该程序load到内存中。在程序运行的之后,就会涉及到堆区和栈区的操作。一般情况下,堆区是向上生长的,栈区是向下生长的,当然不同的处理器架构是不同的。