c语言程序,正常运行都需要内存资源,用来存放变量,常量,函数等代码,这些不同的内容存储的区域也是不同,且不同区域有不同特性。
- 虚拟内存各个区域的分布:
- 栈内存:
- 栈内存存放什么:
①环境变量
②命令行参数
③局部变量
- 栈内存的特点:
①空间有限,尤其在嵌入式环境下。因此不可以用来存储尺寸太大的变量。
②每当一个函数被调用,栈就会向下增长一段,用以存储该函数的局部变量。(随用随申请,用完系统自动释放)
③每当一个函数退出,栈就会向上缩减一段,将该函数的局部变量所占内存归还给系统。
示例:
void fun(int a,int *b)
{
int c; //在函数fun的栈内存中分配
... //fun结束时,系统栈内存向上缩进,释放空间
}
int main()
{
int m=100; //在函数main的栈里分配
fun(m,&m); //调用fun函数时,系统的栈内存向下增长
return 0;
}
2、静态数据:
- 全局变量:定义在函数外部的变量。
- 静态变量:静态局部变量(定义在函数内部,且被static修饰的变量)静态全局变量(定义在函数外部,且被static修饰的变量)
int a; //全局变量,退出整个程序前不会释放
int main(void)
{
static int b; //局部变量,退出整个程序前不会释放
...
}
注:
添加static的静态数据只能在本文件内使用,外部文件不能访问;
3、数据段与代码段:
- 数据段细分为一下几个区域:
①.bss段:存放为初始化的静态数据,它们将被系统自动初始化为0;
②.data段:存放已初始化的静态数据;
③.rodata段:存放常量数据;
- 代码段分为:
①.text段:存放用户代码
②.init段:存放系统初始化代码
int a; //未初始化全局变量,存放在.bss段
static int b=100; //初始化了的全局静态变量,存放在.data段
4、堆内存:
- 堆内存(heap)又被称为动态内存、自由内存,简称堆。
- 堆是唯一可被开发者自定义的区段,开发者可以根据需要申请内存的大小、决定使用的时间长短等。但又由于这是一块系统“飞地”,所有的细节均由开发者自己把握,系统不对此做任何干预,给予开发者绝对的“自由”,但也正因如此,对开发者的内存管理提出了很高的要求。对堆内存的合理使用,几乎是软件开发中的一个永恒的话题。
- 堆内存的特点:
①相比栈内存,堆的总大小仅受限于物理内存,在物理内存允许的范围内,系统对堆内存的申请不做限制。
②相比栈内存,堆内存从下往上增长。
③堆内存是匿名的,只能由指针来访问。
④自定义分配的堆内存,除非开发者主动释放,否则永不释放,直到程序退出。
- 相关API
①、申请堆内存:malloc()/calloc()
②、 清零堆内存:bzero()
③、释放堆内存:free()
示例:
int a;
int *p=&a;
*p=malloc(sizeof(int)); //申请一块大小为sizeof(int)的堆内存
bzero(p,sizeof(int)); //清空刚申请的堆地址
*p=100; //将整形数据100存入堆内存
free(p); //释放堆地内存
int *q=calloc(2,sizeof(int)); //申请二块大小为sizeof(int)的堆地址
//calloc会自动清空堆地址
free(q);