双链表编写malloc项目时出现段错误,但不知错在哪里,求助
程序代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MEM_SIZE 10000 #define LB_SIZE 12 #define ARR_LENGTH 100// char start[MEM_SIZE];// 分配总内存大小 10000 字节 typedef struct l_block{ // 目录项结构 struct l_block *next; int size; }LBlock; LBlock *head; LBlock *freehead=NULL; // 全局指针,指针表头 LBlock *busyhead=NULL; void init_lblock(LBlock **L); // 初始化, 设置一下表头。 void *lmalloc(size_t size); // 分配内存 void *blmalloc(size_t size); // 同上 用最佳拟合法 void lfree(void *ptr); //释放内存 int main(int argc, char* argv[]) { init_lblock(&head);//初始化 freehead=head; char* testarray[ARR_LENGTH]={}; int i=0,index=0; for(i=0;i<100000;i++) { //printf("i=%d\n",i); index=random()%ARR_LENGTH; if(testarray[index]==NULL) { testarray[index]=(char*)lmalloc(20+random()%100);//改为自己实现的MALLOC函数 strcpy(testarray[index],"this is a test"); puts(testarray[index]); } else { lfree(testarray[index]);//改为自己实现的FREE函数 testarray[index]=NULL; } } return (EXIT_SUCCESS); } void init_lblock(LBlock **L) // 初始化, 设置一下表头。 { (*L)=(LBlock*)&start[0]; (*L)->size=MEM_SIZE-8; (*L)->next=NULL; } void *lmalloc(size_t size) // 分配内存 { LBlock* p; p=freehead; LBlock* mark; mark=NULL; int dis; LBlock* front=NULL; if(freehead==NULL) { printf("no free\n"); return; } if(p->size>=size) { mark=p; } else { while(p) { if(p->next && p->next->size>=size) { mark=p->next; front=p; break; } p=p->next; } } if(mark==NULL) { printf("the area is not empty!\n"); return; } if(mark->size>=size+12) { dis=mark->size-size; LBlock* newnode=(LBlock*)( (char*)mark+8+size ); newnode->size=dis-8; newnode->next=mark->next; mark->next=newnode; mark->size=size; } if(front) front->next=mark->next; else freehead=mark->next; mark->next=busyhead; busyhead=mark; return (char*)busyhead+8; } void *blmalloc(size_t size) // 同上 用最佳拟合法 { } void lfree(void *ptr) //释放内存 { if(busyhead==NULL) return; LBlock* p; p=busyhead; LBlock* mark; mark=NULL; LBlock* front; front=NULL; if( ((char*)busyhead+8)==ptr ) { mark=busyhead; } else { while(p) { if( p->next && ((char*)p->next+8)==ptr ) { mark=p->next; front=p; break; } p=p->next; } } if(mark==NULL) { printf("not found!\n"); return; } if(front) front->next=mark->next; else busyhead=mark->next; mark->next=freehead; freehead=mark; printf("busyhead=%p\tfreehead=%p\n",busyhead,freehead); }
求大侠们各显神通