heap
在低地址
malloc分配heap的地址
int* arr=malloc(40*sizeof(int));
160B(实际164B或者168B,多出来的在头部,用于记录大小等信息,但是返回的指针是在这个头的后面)
执行free函数时,指针会机械地回退4B or 8B 获取大小信息,并且free掉后面相应大小的内容
int* arr=malloc(100*sizeof(int));
free(arr+60);
//出错,指针会调到arr+58/59,将这里面的内容解释为内存块大小再释放
int arr[100];
//这样静态申请与堆无关,但也有head信息
free(array);
arr[-1]=0;
//这样把头覆盖掉了,会出错
空闲的空间组成一个链表,每个head信息都记录了大小,下次malloc的时候遍历一遍
怎么分配《操作系统》会讲
free只是把内存块加到空闲链表,因为反正可以覆盖
操作系统可以把分散的零碎的空间弄成连续的空间,返回句柄(二级指针,是一个指针列表)
void** handle=NewHandle(40);
Handlelock(handle);
//告诉操作系统不要挪动NewHandle指向的内存,它们正在被句柄寻址
HandleUnlock(handle);
stack
void A()
{
int a;
short b[4];
double c;
//从栈里分配内存
B();
C();
}
栈里有指针(栈指针)记录已分配和未分配的边界,每有一个新函数分配局部变量,他会移动,并将移动后的地址作为函数访问变量的基地址;函数返回后,栈指针回退。
void B()
{
int x;
char* y;
char* z[2];
C();
}
void C()
{
double m[3];
int n;
}
汇编代码
简单讲了下
假设RAM有32个通用寄存器
ALU进行加法乘法移位操作