Реализация функции malloc и free в задаче c

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

Реализуйте библиотеку распределения памяти, подобную 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, я обнаружил, что в следующей части кода, которую я получаю, сегментация не удалась. Не знаю, как это исправить.

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

Возможный дубликат Как отладить ошибку сегментации?

rghome 28.10.2018 11:18

Вам нужно научиться пользоваться отладчиком. Это вызвано неправильным указателем (часто нулевым). Чтобы расширить это, это никому не помогает указать, где в этом случае ошибка. Это типичная ошибка программирования на C, и вам просто нужно выполнить ее с помощью отладчика или добавить операторы printf, пока вы не выясните, где происходит сбой и почему.

rghome 28.10.2018 11:19

Недопустимо объявлять массив символов и делать другие объекты псевдонимами его содержимого.

Antti Haapala 28.10.2018 11:31

Верно, очень опасно преобразовывать массив char в int ... но, строго говоря, на некоторых устройствах это «не рекомендуется, но допустимо ... используйте на свой страх и риск». Я не понял, что еще не так ... это довольно сложный небольшой фрагмент кода. Очевидно, что при таком использовании кода существует большая вероятность ошибки, поэтому на него стоит внимательно посмотреть!

ComputerNerd 28.10.2018 11:44

@AnttiHaapala: программа, которая использует массив char для других объектов, может соответствовать. Это просто не совсем соответствует. Поскольку это выглядит как инструкция, данная как назначенный проект, студент имеет право предположить, что реализация C, используемая для курса, поддерживает его для цели задания. Это разрешено стандартом C, который предлагает расширения языка, включая определение поведения, не определенного стандартом.

Eric Postpischil 28.10.2018 11:59

@EricPostpischil, это тоже правда. Однако большинство используемых сейчас компиляторов на самом деле не допускают это - вам просто может сойти с рук.

Antti Haapala 28.10.2018 12:03

@AnttiHaapala: большинство компиляторов поддерживают его с переключателями для отключения оптимизации или разрешения псевдонимов.

Eric Postpischil 28.10.2018 13:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
1 667
0

Другие вопросы по теме