内存分配及存储

一、C语言的几个存储区

(一)堆和栈的区别

1、申请方式
栈(stack):由编译器操作系统自动分配,自动开辟空间和管理。
堆(heap):由程序员自己申请并指明大小(例如C中的malloc,c++中的new)
2、申请后系统的响应
栈(stack):如果栈的剩余空间大于所申请的空间,系统将会为程序提供内存,否则程序将报错提示栈溢出
堆(heap):操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一块大于所申请空间的一块空间(即堆节点),然后分配给程序,并把这块空间在该链表中删掉。
对于大部分系统来说,会在这块内存空间的首地址记录本次分配的大小,这样就能正确的释放。
由于找到的堆节点不一定正好等于申请的大小,系统将会把多余的部分重新放入空闲链表中。但是频繁的申请释放会产生碎片问题,即内存空间不连接。
3、申请大小
栈(stack):在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,所以栈的栈顶地址和最大容量是预先设计好的(2M),所以能从栈中获取的空间较小。
堆(heap):堆是向高地址扩展的数据结构,是不连续的内存区域,大小由系统决定,所以空间较大。
4、分配方式
栈(stack):静态分配(由编译器完成)/动态分配(由函数进行分配,但释放还是由编译器释放)
堆(heap):动态分配
5、碎知识
栈(stack):有些书中又称堆栈
(1)存放的是局部变量、块变量、形参和返回值
(2)先进栈的最后出栈(即先进后出,后进先出

(二)全局区(静态区)

1、初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域
2、不会随程序的运行而改变

(三)常量区

程序结束时释放

(四)程序代码区

1、存放的是程序的二进制代码
2、内存由系统管理

二、存储类型关键字

(一)auto变量

1、如果没有特别声明static,函数中定义的局部变量均为auto类型
2、函数调用时系统分配存储空间,调用结束时会自动释放这些空间
3、属于动态存储方式

(二)static变量

1、用static声明的局部变量在调用结束后不会消失,而是保存原来的值。所以使用static局部变量定义只需要赋值一次

(三)register寄存器变量

1、 可将局部变量的值存入CPU的寄存器中
(1)只有动态存储的变量(自动局部变量和形参)才可以作为寄存器变量来存储,局部静态变量不可
(2)寄存器变量个数有限,不能定义任意多个

(四)extern外部变量(全局变量)

1、在函数外部定义的变量

(五)附图解

1、全局变量是在函数体外定义的变量,局部变量是在函数体内定义的变量
2、在同一个项目中,普通的全局变量在定义变量前面加上关键字extern(例如:extern int g_b),即引入外部符号,就可以在其他文件中找到相同变量,修改文件内容,不安全。但静态全局变量因为加了static,则不可以被其他文件引用。局部变量和函数的静态关键字同理。 内存分配及存储