首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

双链表编写malloc项目时出现段异常,但不知错在哪里

2012-09-01 
双链表编写malloc项目时出现段错误,但不知错在哪里,求助[codeC/C++][/code]#include stdio.h#include

双链表编写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不是也要判断内存分配是否成功吗?

C/C++ code
#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);} 

热点排行