第二章 存储管理
复杂的程序一般需要动态分配内存,C语言用malloc和free来分配和释放内存,lcc也可以使用malloc和free,但是可以考虑另外一种更有效,更容易理解的方式。
2.1 内存管理接口
内存是在分配区(arena)中进行分配的。定义为
<alloc.c functions>=
extern void *allocate ARGS((unsigned long n, unsigned a));
extern void deallocate ARGS((unsigned a));
调用时:
struct T *p;
p = allocate(sizeof *p, a);
其中a是分配区,p为一个指针,使用这种方法,不论p指向什么类型的变量,都可以正确的分配空间。因为sizeof返回的一般为unsigned int 和unsigned long型,所以函数声明时用unsigned long 来定义n。
由于这种分配方式经常使用,所以我们把它定义成宏。
<alloc.c exported macros>=
#define NEW(p,a) (§ = allocate(sizeof (*p),(a));
#define NEW1(p,a) memset(NEW(p,a), 0, sizeof (*p));
宏NEW返回一个指向尚未初始化的空间的指针,NEW0将空间置为零并返回第一个参数。
数组分配方式为:
<alloc.c function>=
extern void *newarray ARGS((unsigned long m, unsigned long n, unsigned a));
2.2分配区的表示
分配区定义
struct block{
struct block *next;
char *limit;
char *avail;
}
next指向下一个链表中下一块,小于avail所指的区块都是已分配的区块,从avail指的地址到limit指向的地址都是待分配的内存块。
2.3空间分配
要弄清楚空间分配,必须要理解空间分配的目的。allocate函数类似于malloc函数,目的都是开辟一个大小一定的空的内存块,供变量或者结构体或者数组使用。
补充知识:
1.C语言union用法:
union中多个成员公用一个内存
例:
union align
{
long l;
char *p;
double d;
int