提示:現在內存區定出一片相當大的連續空間(如1000字節)。然后開辟與釋放都在此空間進行。假設指針變量p原已指向未用空間的開頭,調用alloc(n)后,開辟了n個字節可供程序適使用。現在需要使 p的值變為p+n,表示空白未用區從p+n地址開始,同時要將開辟區的起始地址(p)作為函數值返回,以表示可以利用從此點開始的單元。如果要開辟的區太大(n大),超過了預想的(1000)字符,則alloc(n)函數返回指針NULL,表示開辟失敗。
#include <stdio.h> #define LEN (1000) unsigned char base[LEN]; unsigned char *p=(unsigned char *)base; void *Alloc(unsigned int n) { unsigned char *pp=p; if(p+sizeof(unsigned int)+n<base+LEN&&n>0) { *(unsigned int*)p=n; p+=sizeof(unsigned int)+n; pp+=sizeof(unsigned int); } else { pp=NULL; } return pp; } void Free(unsigned char *ptr) { if(!ptr) return; p-=sizeof(unsigned int)+*(unsigned int *)(ptr-sizeof(unsigned int)); } int main() { unsigned char *a=NULL; printf("base=%p,p=%p,a=%p\n",base,p,a); a=Alloc(10); printf("base=%p,p=%p,a=%p\n",base,p,a); Free(a); printf("base=%p,p=%p,a=%p\n",base,p,a); return 0; }