## 内存管理 ## 进程空间 - 程序,是经源码编译后的可执行文件,可执行文件可以多次被执行,比如我们可以多次打开 office。 - 而进程,是程序加载到内存后开始执行,至执行结束,这样一段时间概念,多次打开的wps,每打开一次都是一个进程,当我们每关闭一个 office,则表示该进程结束。 - 程序是静态概念,而进程动态/时间概念。 ###进程空间图示 有了进程和程序的概念以后,我们再来看一下,程序被加载到内存以后内存空间布局是什么样的 ![](https://img-blog.csdnimg.cn/img_convert/5d2e966e95f1518585804e57779e7fe6.png) --- ## 栈内存(Stack) - 栈中存放任意类型的变量,但必须是 auto 类型修饰的,即自动类型的局部变量, 随用随开,用完即消。 - 内存的分配和销毁系统自动完成,不需要人工干预 - 栈的最大尺寸固定,超出则引起栈溢出 + 局部变量过多,过大 或 递归层数太多等就会导致栈溢出 ```c int ages[10240*10240]; // 程序会崩溃, 栈溢出 ``` ```c #include int main() { // 存储在栈中, 内存地址从大到小 int a = 10; int b = 20; printf("&a = %p\n", &a); // &a = 0060FEAC printf("&b = %p\n", &b); // &b = 0060FEA8 return 0; } ``` --- ## 堆内存(Heap) - 堆内存可以存放任意类型的数据,但需要自己申请与释放 - 堆大小,想像中的无穷大,但实际使用中,受限于实际内存的大小和内存是否连续性 ```c int *p = (int *)malloc(10240 * 1024); // 不一定会崩溃 ``` ```c #include #include int main() { // 存储在栈中, 内存地址从小到大 int *p1 = malloc(4); *p1 = 10; int *p2 = malloc(4); *p2 = 20; printf("p1 = %p\n", p1); // p1 = 00762F48 printf("p2 = %p\n", p2); // p2 = 00762F58 return 0; } ``` ## 最后,如果有任何疑问,请加微信 **leader_fengy** 拉你进学习交流群。 开源不易,码字不易,如果觉得有价值,欢迎分享支持。