将struct分配给char数组

时间:2013-07-10 12:50:31

标签: c malloc free

我正在尝试创建自己的malloc但我仍然坚持一点。我们知道,我们必须在可用空间中将struct指定为元数据,如此图所示。 enter image description here

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

我的heap_space将成为我的“RAM”。现在我被困在一点: -

如何将我的结构myblock分配给heap_space,还有一件事我们应该记住,每当新请求到来时,myblock的位置都会改变按照分配的(请求的)空间。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果是C ++,则应使用myblock *free_ptr = reinterpret_cast<myblock*>(heap_space);初始化自由指针,然后初始化sizenextprevbuffer { {1}}。

在C中,您将使用常规C样式转换,free_ptr

答案 2 :(得分:0)

您应该声明

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

所以你的malloc将返回myblockvar.buffer