内存包括5个区域:
1.栈区
系统分配以及回收内存,函数体内创建的变量分配在栈区。
例如:
int main()
{
int a = 10;
int b = 2;
}
a存在内存的栈区,系统分配了一个四个字节的空间,里面存放了一个数字10,出了这个大括号,系统就会回收a所占的内存空间,同理b也是在栈区。
2.堆区(动态内存分配)
由用户(程序员)分配回收,如果忘记回收,那么就会造成内存泄露,内存越用越少,有可能导致内存不够用,造成系统崩溃,如果没有达到极限,程序还是会没事,当程序退出时系统会来回收一次。
申请内存时用malloc来申请, 申请后要用free来释放掉
3.常量区
用来存放常量的内存区域
int main()
{
int a = 10;
int b = 2;
}
10 和2 存在常量区, a = 10中栈区的10是由常量区中的10拷贝过来的,也就是有两个10,常量区中存放的一般是数值,字符和字符串。
4.全局静态区
定义在函数体外面的变量,由系统开辟空间,程序运行过程中一直存在,直到系统退出
int x = 8;
int main()
{
int a = 10;
int b = 2;
}
在函数外面定义的x就是存在全局静态区的,它的生命周期随着程序打开就开始分配存在,在程序退出时结束,这里的x = 8,8也是从常量区拷过来的 ,像所学的oc里的类就是存在全局静态区的。
5.代码区
存放源代码编译结果的区域
我们平时写的代码是源代码,例如 int a = 10; 源代码计算机是读不懂的,计算机只能读懂二进制,由0 和1 组成的序列。我们要对源代码进行编译,编译成二进制文件,如果是Windows系统运行会生成.exe文件, 如果是mac系统就会生成.app文件, 我们所写的所有函数编译成二进制之后就放在代码区。