在Malloc中编译错误

时间:2020-10-20 21:49:23

标签: c

我正在遵循这个tutorial来编写自己的malloc和free版本。完整的源代码是here,我正尝试在笔记本电脑上运行它。

我有3个文件:

{% extends "base.html" %}
{% block content %}
{% if all_site %}
    <ul>
    <h3>Here all my site:</h3>
    {% for site in all_site  %}
        <li><a href="/site/{{ site.id }}/"> {{ site.name }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <h3> You don't have any Site.</h3>
{% endif %}
{% endblock content %}

我尝试通过在命令行上执行以下命令来编译它:

mymalloc.h
mymalloc.c
memgrind.c // Where my main method is to test my malloc function

但是我遇到以下错误:

gcc -c mymalloc.c
gcc -o memgrind.c memgrind

我的文件编译错误吗?还是代码有问题? (我正在执行和编译的代码与链接中提供的源代码没有区别)

谢谢。

编辑:

现在它可以正确编译,但是出现此错误:

warning: implicit declaration of function MyMalloc [-Wimplicit-function-declaration]
 int *p=(int)MyMalloc(100*sizeof(int));
             ^~~~~~~~
memgrind.c:5:8: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
 int *p=(int)MyMalloc(100*sizeof(int));

但是我只在mymalloc.h内部声明一次吗?

供参考,下面是代码:

mymalloc.c

/tmp/ccKyTOaY.o:(.data.rel.local+0x0): multiple definition of `freeList'
/tmp/cc0jpDeq.o:(.data.rel.local+0x0): first defined here
collect2: error: ld returned 1 exit status

mymalloc.h

#include<stdio.h>
#include<stddef.h>
#include "mymalloc.h"


void initialize(){
 freeList->size=20000-sizeof(struct block);
 freeList->free=1;
 freeList->next=NULL;
}

void split(struct block *fitting_slot,size_t size){
 struct block *new=(void*)((void*)fitting_slot+size+sizeof(struct block));
 new->size=(fitting_slot->size)-size-sizeof(struct block);
 new->free=1;
 new->next=fitting_slot->next;
 fitting_slot->size=size;
 fitting_slot->free=0;
 fitting_slot->next=new;
}


void *MyMalloc(size_t noOfBytes){
 struct block *curr,*prev;
 void *result;
 if(!(freeList->size)){
  initialize();
  printf("Memory initialized\n");
 }
 curr=freeList;
 while((((curr->size)<noOfBytes)||((curr->free)==0))&&(curr->next!=NULL)){
  prev=curr;
  curr=curr->next;
  printf("One block checked\n");
 }
 if((curr->size)==noOfBytes){
  curr->free=0;
  result=(void*)(++curr);
  printf("Exact fitting block allocated\n");
  return result;
 }
 else if((curr->size)>(noOfBytes+sizeof(struct block))){
  split(curr,noOfBytes);
  result=(void*)(++curr);
  printf("Fitting block allocated with a split\n");
  return result;
 }
 else{
  result=NULL;
  printf("Sorry. No sufficient memory to allocate\n");
  return result;
 }
}

void merge(){
 struct block *curr,*prev;
 curr=freeList;
 while((curr->next)!=NULL){
  if((curr->free) && (curr->next->free)){
   curr->size+=(curr->next->size)+sizeof(struct block);
   curr->next=curr->next->next;
  }
  prev=curr;
  curr=curr->next;
 }
}

void MyFree(void* ptr){
 if(((void*)memory<=ptr)&&(ptr<=(void*)(memory+20000))){
  struct block* curr=ptr;
  --curr;
  curr->free=1;
  merge();
 }
 else printf("Please provide a valid pointer allocated by MyMalloc\n");
}

memgrind.c

#include<stdio.h>
#include<stddef.h>

char memory[20000];

struct block{
 size_t size;
 int free;
 struct block *next; 
};

struct block *freeList=(void*)memory;

void initialize();
void split(struct block *fitting_slot,size_t size);
void *MyMalloc(size_t noOfBytes);
void merge();
void MyFree(void* ptr);

1 个答案:

答案 0 :(得分:1)

警告提示您尝试将int放入int *中,因此 试试这个

int *p=(int*)MyMalloc(100*sizeof(int));
相关问题