这是我的问题
实现类似malloc的内存分配库。
声明一个25000字节的数组。
您必须实现类似于malloc()的函数。称之为MyMalloc()。它的签名类似于malloc()。您还应该实现MyFree(),其签名和功能类似于free()。
MyMalloc()仅从前面提到的25000字节数组中分配内存。
管理内存所需的所有数据结构也必须驻留在同一阵列中。
MyMalloc()和MyFree()必须位于名为mymalloc.c的文件中。您还应该提供合适的头文件mymalloc.h。
我们的测试程序包含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调试器,我发现在下面的代码中,我正在获取并且分段失败。不知道如何解决