Реализация malloc и свободной функции в проблеме c - PullRequest
0 голосов
/ 28 октября 2018

Вот мой вопрос

Реализация библиотеки выделения памяти типа malloc.

  1. Объявление массива из 25000 байтов.

  2. Вы должны реализовать функцию, подобную malloc ().Назовите это MyMalloc ().Его подпись похожа на malloc ().Вам также следует реализовать MyFree (), который имеет сигнатуру и функциональность, аналогичные функции free ().

  3. MyMalloc () выделяет память только из ранее упомянутого массива из 25000 байтов.

  4. Все структуры данных, необходимые для управления памятью, также должны находиться в одном массиве.

  5. MyMalloc () и MyFree () должны бытьв файле с именем mymalloc.c.Вы также должны предоставить подходящий заголовочный файл mymalloc.h.

  6. Наша тестовая программа содержит main () и включает mymalloc.h.Не включайте main () в ваш mymalloc.c.

А вот мое мнение

#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);
}

Код просто отлично работает в Dev c ++ в Windows.Но в Linux Если я пытаюсь освободить первый выделенный блок (addr1), а затем пытаюсь перераспределить что-то, это дает мне ошибку сегментации (сбрасывается ядро).Я искал об этой ошибке и обнаружил, что это потому, что я читаю в нераспределенные указатели.Почти сутки пытался его отладить. Но все равно не смог найти где ошибка.Любое предложение?

Обновлено: с помощью отладчика GDB Я обнаружил, что в следующей части кода я получаю и сегментация не удалась. Не знаю, как это исправить

В отладчике обнаружена ошибка

...