双链表编写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);
}
求大侠们各显神通



