一、划分
1、代码区:存放编译后可执行代码的区域。
2、静态存储区:存在着静态变量(static修饰的变量,如:static int a)以及全局变量。全局变量和静态变量在分配内存时会被初始化器初始化为类型0。
3、常量区:存放一些常量(如: char *p = “abcd”)且被认为是只可读的。
4、栈区:存放函数的形参和局部变量(包括符合类型的局部变量), 例如在main函数中定义一个int a; 编译器就会在栈区分配4个字节给a。函数结束后局部变量会被销毁。
5、堆区:C语言中用malloc realloc calloc 函数分配的动态内存都在堆区,如 char *p=(char*)malloc(10); 则p为指针,是一个局部变量,在栈区。p所指向的地址为堆区动态分配的空间,堆区由操作系统进行管理(可以认为有一个空闲内存分配表)。
二、动态存储方式与静态动态存储方式
1>从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
- 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
- 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。
- 2>说明
- (1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
- (2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
- (3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
- (4)对于动态存储方式一般为malloc、realloc、calloc来进行申请时进行的实时分配。
- malloc函数--分配内存块,但是不对内存块进行初始化(高效)
- calloc函数--分配内存块,并且对内存块进行初始化(效率比malloc低)
- realloc函数--调整先前分配的内存块(需要两个参数,且只进行尾巴扩充和缩小,不影响原来数据)