在C问题中实现malloc和free函数

时间:2018-10-28 10:08:51

标签: c malloc free

这是我的问题

实现类似malloc的内存分配库。

  1. 声明一个25000字节的数组。

  2. 您必须实现类似于malloc()的函数。称之为MyMalloc()。它的签名类似于malloc()。您还应该实现MyFree(),其签名和功能类似于free()。​​

  3. MyMalloc()仅从前面提到的25000字节数组中分配内存。

  4. 管理内存所需的所有数据结构也必须驻留在同一阵列中。

  5. MyMalloc()和MyFree()必须位于名为mymalloc.c的文件中。您还应该提供合适的头文件mymalloc.h。

  6. 我们的测试程序包含main(),并且包含mymalloc.h。不要在mymalloc.c中包含main()。

这是我的灵魂

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define MX 25000
#define allocate 'a'
#define notallocate 'f'
#define meta 5


char* mymalloc(int size);
void myfree(char* address);
char* findlocation(int size);
void split(char* ptr,int size);

char memory[MX]={'\0'};
char* base=memory;
int total=0;
int freeby=0;
char* mymalloc(int size){
  if(size<=0){
            printf("Error:Size cant be minius value\n");
            exit(0);
           return NULL;
  }
   if(!*base){
           *base=notallocate;
           *(int*)(base+1)=MX-5;
}

           char* ptr=findlocation(size);
  if(ptr)
  {
          if(*(int*)(ptr+1)>=size){
          split(ptr,size);
    }
}else{
    return NULL;
}
    //total+=(size+5);
    printf("Memory allocation succeed Address:%p:::Allocated size 
   is:%d\n",ptr,size);
   return (ptr);
}

  void myfree(char* address)
 {
      char* temp,*next,*pre,*holder;
      temp=base;int size;

      while(true)
      {
        size=*(int*)(temp+1);
        if(temp==address)
      {
        freeby+=size=*(int*)(temp+1);
        break;
      }
        else if(!*temp)
      {
        return;
    }
       else
    {
        pre=temp;
        temp=temp+size;
        next=temp+*(int*)(temp+1);
     }
    }
    freeby+=size=*(int*)(temp+1);
    if(*next==notallocate){
       *temp=notallocate;
       *(int*)(temp+1)=*(int*)(temp+1)+*(int*)(next+1);
     }


   if(*pre==notallocate)
  {
    *temp=notallocate;``
    *(int*)(pre+1)=*(int*)(temp+1)+*(int*)(pre+1);
  }else{
      *address=notallocate;

  } 
   printf("Memory freed sucessfully:%p:::Freed size:%d\n",address,size-5);
  }

   char* findlocation(int size)
  {
   char* temp=base;
   int freesize=0;
   while(true)
  {
    freesize=*(int*)(temp+1);
    if(*temp==notallocate && freesize>=size+5 )
    {
        return (temp);
    }else if(!temp){
        return NULL;
    }else{
        if(temp+freesize+size>=memory+24999)
        {
            printf("Error!sized excessed memory limit \n");
            exit(0);
            return NULL;
        }
        temp=temp+freesize;
      }

   }
    return (temp);
 }


 void split(char* ptr,int size)
 {
    char* new;
    int blocksize=*(int*)(ptr+1);
    blocksize=blocksize-size-meta;
    new=ptr+size+meta;
    *new=notallocate;
    *(int*)(new+1)=blocksize;
    *(int*)(ptr+1)=size+meta;
    *ptr=allocate;

  }


void main(){
char* addr1=mymalloc(8);
char* addr2=mymalloc(400);
char* addr3=mymalloc(100);
char* addr4=mymalloc(200);
char* addr5=mymalloc(300);
char* addr6=mymalloc(400);
char* addr7=mymalloc(500);
char* addr10=mymalloc(8);
//printf("8 %p\n",addr1);
//printf("400 %p\n",addr2);
//printf("100 %p\n",addr3);
//printf("200 %p\n",addr4);
//printf("1300 %p\n",addr5);
//printf("400 %p\n",addr6);
//printf("500 %p\n",addr7);
 myfree(addr1);
 myfree(addr2);
 myfree(addr7);
 myfree(addr6);
  //printf("Afrer freeeing\n");
  char* addr8=mymalloc(1300);
  //printf("1300 %p\n",addr8);
    //char* addr10=mymalloc(8);
  //printf("1300 %p\n",addr10);
 //char* addr5=mymalloc(120);
}

代码在Windows中的Dev c ++中工作正常。但是在Linux中,如果我尝试释放第一个分配的块(addr1),然后尝试重新分配某些内容,则会给我分段失败的问题(核心转储)。我搜索了此错误并发现了该错误,因为我正在读取未分配的指针。尝试了将近一天的时间来调试它,但仍然找不到错误的地方。有什么建议吗?

已更新: 使用GDB调试器,我发现在下面的代码中,我正在获取并且分段失败。不知道如何解决

Error found on debugger

0 个答案:

没有答案