不久的将来,我们要开始学习在C中动态申请和释放内存。在学习它们之前,我们先学习程序内存的分区,为掌握和理解动态申请、释放内存做好基础铺垫。
1. 为什么程序的内存有分区
一般而言,我们的住房会分成多个区域(卧室、厨房、阳台、卫生间等),不同区域有不同的功能。
运行时,程序分区的道理也是一样的,它
方便操作系统管理程序,内存的不同区域,功能不同
。
通过一个例子可以看到全局变量和局部变量存储的区域是不一样的。
#include <string.h>
#include<stdio.h>
int g_nValue1 = 0;
int g_nValue2 = 0;
int main(int argc, char* argv[])
{
int nValue1 = 0;
int nValue2 = 0;
printf("%p,%p\r\n", &g_nValue1,&g_nValue2);
printf("%p,%p\r\n",&nValue1,&nValue2);
return 0;
}
运行结果:全局变量间存储的地址相近,局部变量存储地址相近
2. 程序运行时的内存分区
作为初学者,我们简单认识下,程序有
全局区
、
栈区
和
堆区
即可。
全局区:在main函数执行前就已经分配好,程序的代码(机器码)、全局变量都在全局区
-
栈区:随着函数调用及返回,会被自动分配和回收。栈的空间大小比较有限(M级别)
。
以下代码可以证明,栈的空间比较有限:
#include <stdio.h>
int main(int argc, char* argv[])
{
char szBuff[10000000];
return 0;
}
运行结果:栈溢出
不管是全局区还是栈区的内存,他们通常都只占可以使用的内存的一小部分,大量的内存被操作系统控制,按需动态分配。
这时,操作系统的角色类似于酒店,而内存就是房间。我们动态申请内存的动作,类似于入驻酒店前订房;我们动态释放内存的动作,类似于退房。房间一直都存在那,我们能否使用,取决于酒店是否授权给我们(出租给我们)。
内存也类似,内存一直都存在,但是我们程序是否能够使用,使用哪块地址的内存,取决于操作系统如何分配给我们
。
以上介绍的,被操作系统控制管理的动态分配、回收的内存区域,就称为堆
。
我们之后会学习,如何使用C标准库中的malloc
与free
函数,动态申请和释放堆中的内存。
3. 学习视频地址:内存的分区:全局区、栈区、堆