0

我正在尝试创建自己的malloc,但我被困在一点上。正如我们所知,我们必须struct在可用空间中分配元数据,正如这张图片中提到的那样。 在此处输入图像描述

char heap_space[MEM_BUFFER];    
struct myblock
    {
        struct myblock *next;
        struct myblock *prev;
        int size;
        char *buffer;
    }

我有我的heap_space,这将是我的“RAM”。现在我被困在一点上:-

如何将我的结构分配myblockheap_space,我们应该记住的一件事是,每次新请求到来时,myblock都会根据分配的(请求的)空间更改 的位置。

4

3 回答 3

1

我不确定是否理解您的问题,但您为什么不尝试以下方法:

#define MEM_BUFFER 4096
#define size_t unsigned int


char heap_space[MEM_BUFFER] = {0};
struct myblock
{
  struct myblock *next;
  struct myblock *prev;
  int size;
  char *buffer;
};

void *malloc(size_t size)
{
  struct myblock *tmp = heap_space;
  if (tmp != 0) // != 0 since NULL is in stdlib
    while (tmp->next != 0)
      tmp = tmp->next;
  struct myblock *new_elem = tmp; //your question I guess
  new_elem->prev = tmp;
  new_elem->size = size;
  new_elem->buffer = new_elem + sizeof(*new_elem);
  new_elem->next = new_elem->buffer + new_elem->size;
  return (new_elem->buffer);
}

int main()
{
  char *str1 = malloc(10);
  char *str2 = malloc(10);

  strcpy(str1, "Hello");
  strcpy(str2, "World");

  printf("%s %s\n", str1, str2);
}

我猜你应该以不同的方式思考你的记忆,在你的 heap_space 里面你可以有很多东西。

如果您有不明白的地方,请询问。

您还应该使用 void * 和 unsigned int 而不是 int

此外,您还有一些事情要做:

  • 检查所需的大小是否在您的阵列中可用
  • 如果您想实现您的 realloc,请提供更多空间
  • 实现你的自由功能

如果你在 linux 上,你应该尝试使用 brk/sbrk 而不是拥有你的“堆空间”。但最棒的是使用自己的 malloc 运行“真实”程序(使用 LD_PRELOAD)

于 2013-07-10T13:05:59.223 回答
0

如果是 C++,你应该使用来初始化你的空闲指针,myblock *free_ptr = reinterpret_cast<myblock*>(heap_space);然后初始化size,next和of 。prevbufferfree_ptr

在 C 中,您将使用常规的 C 风格转换,struct myblock *free_ptr = (struct myblock*)heap_space;.

于 2013-07-10T13:05:27.110 回答
0

你应该声明

struct myblock
    {
        struct myblock *next;
        struct myblock *prev;
        int size;
        char buffer[0];
    }

所以你的 malloc 会返回myblockvar.buffer

于 2013-07-10T13:45:36.390 回答