双链表编写malloc项目时出现段错误,但不知错在哪里,求助
[code=C/C++][/code]#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);
}
[解决办法]
把malloc改成静态数组吧。
[解决办法]
用valgrind带着跑一下吧。
像内存问题,借助于工具,能很快找到错误的地方。
[解决办法]
在每个分配和释放的地方,都加入一个调试语句。
[解决办法]
调用你自己实现的lmalloc
要加判断的。
调用<stdlib.h>里的malloc不是也要判断内存分配是否成功吗?
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MEM_SIZE 10000#define LB_SIZE 12#define ARR_LENGTH 100char start[MEM_SIZE];// 分配总内存大小 10000 字节typedef struct l_block{ // 目录项结构 struct l_block *next; unsigned 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]={0}; int i=0,index=0; for(i=0;i<100000;i++) { printf("i=%d\n",i); index=rand()%ARR_LENGTH; if(testarray[index]==NULL) { testarray[index]=(char*)lmalloc(20+rand()%100);//改为自己实现的MALLOC函数 /*加上这个判断*/ if (testarray[index] == NULL) { printf("lmalloc failed!"); return -1; } 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 NULL; } 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 NULL; } 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) // 同上 用最佳拟合法{ return NULL;}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);}