** 程序分为:代码段;数据段data;bss段; 堆栈; **
用于存放程序代码的区域, 编译时确定, 只读。更进一步讲是存放处理器的机器指令。
以下的分内是按照进程的内存结构去分类的:
代码段
就是C程序编译后的机器指令,也就是我们常见的汇编代码。
数据段Data
(存放初始化的全局变量和常量、静态变量)
这里继续引入数据段的概念,数据段通常用来存放程序已初始化的(非0)全局的变量和静态的变量还有就是常量数据。
BSS段
不在可执行的文件中,由系统初始化。
通常用来存放的是程序中没有初始化或者初始化为0的全局变量和静态变量的一块内存区域。
其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
栈:
1.存放函数参数和内部定义的局部变量(是不包括static修改的局部变量)以及任务切换的上下文信息,函数返回后恢复 ;在函数或过程后,系统会清楚栈上保存的局部变量、函数调用信息等。
2.多线程的基 础是栈,每个线程都有自己专属的栈,中断和异常处理也具有自己专属的栈。
栈的溢出:
函数调用太深(如递归调用),变量申请太大,参数太大。
堆:
堆是先进先出(FIFO)数据结构。堆的地址空间是向上增加,即当堆上保存的数据越多,堆的地址越高。动态内存分配。
需要程序员手动管理内存,是不连续的,存在内存碎片,通过链表将堆空 间连接起来,从逻辑上看就是连续的,每次申请的空间是连续的。
注意:
以上的分类,数据区也称为静态区或者全局区。用来存放的是静态变量和去阿奴变量。内部再细分就是已经初始化的和未初始化的。
常量可以单独提出来的,称为常量区。
堆和栈的区别:
申请方式: 堆需要手动申请和释放,栈则由系统自动分配,因此堆空间使用更加灵活方便;
申请大小: 栈空间是一块连续空间,但是空间比较小,因此容易造成栈溢出,从高地址向低地址扩展;
堆空间是不连续的,空间比较大,从低地址向高地址扩展。
申请效率:栈由系统自动分配,堆分配比较慢,因为空间不连续容易造成内存碎片