1、堆大小可变,无规则,用于分配、销毁相应的内存
2、栈:存储函数调用的所有信息、局部变量
3、static:静态/全局变量
4、code:instruction、需要执行的指令
当一个函数调用结束时,我们会回到这个语句,一旦函数xx返回,它之前所占用的内存也会被清除。
stack(1MB)<——os分配
D() |
C() |
B() |
A() |
实际的栈帧分配和局部变量的分配是在运行时
如果栈增长超出了预留的内存优化你大小(如所给1MB),如:A调用B,B调用C,C调用D......
耗尽了栈的空间,则会发生溢出(stack overflow),即程序崩溃
一种发生栈溢出的情形就是“无穷递归”
在c中使用动态内存所用四个函数:
malloc、calloc、realloc、free
c++是:
rew、delete
任何使用malloc分配的内存最终通过用free进行释放
如果分配了内存,之后不再需要使用了,那么释放内存是程序员的职责
任何在堆上分配的内存,在函数调用结束后,并不会(像栈那样)自动释放动态分配的内存(我们可以使用free函数释放)
p=(int *)malloc(20*sizeof(int))//如果想要20个整型元素的数组,只需要向malloc传入(20*整型大小)
这时堆上会分配一个连续的够20个整型存放的内存
(也可能是不连续的内存块,通过链表组合在一起)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a;//goes on stack
int *p;//整型指针p是main函数的局部变量,分配在main函数的栈帧上
// malloc函数返回void指针,而p是一个整型指针,p会存了在heap上的这块地址
p=(int *)malloc(sizeof(int));//malloc会在堆上申请和分配4个字节的内存,返回一个指向这块内存起始地址的指针
*p=10;//用p来解引用地址,写入值
p=(int *)malloc(sizeof(int));//再次调用malloc函数时,堆上会再次分配出4个字节,之前分配的那块内存还在堆上,消耗着堆内存,不会被自动收回
*p=20;
printf("%d\n",p);
printf("%d\n",*p);
return 0;
}