繁体   English   中英

将结构分配给char数组

[英]Assign struct to char array

我正在尝试创建自己的malloc但是我只停留在一点上。 如我们所知,我们必须在可用空间中将struct分配为元数据,如该图所示。 在此处输入图片说明

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

我有我的heap_space ,它将是我的“ RAM”。 现在我只停留在一点:

如何将我的结构myblock分配给heap_space ,我们需要牢记的一点是,每次出现新请求时, myblock的位置都会根据分配的(请求的)空间进行更改。

我不确定您的问题是什么,但是为什么不尝试以下操作:

#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

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

  • 检查所需大小是否在您的阵列中可用
  • 给更多的空间,以防您想实现重新分配
  • 实现您的免费功能

而且,如果您使用的是Linux,则应尝试使用brk / sbrk,而不要使用“堆空间”。 但是最重​​要的是使用您自己的malloc运行“实际”程序(使用LD_PRELOAD)

如果是C ++,则应使用myblock *free_ptr = reinterpret_cast<myblock*>(heap_space); 初始化您的空闲指针,然后初始化free_ptrsizenextprevbuffer

在C语言中,您将使用常规C样式转换, struct myblock *free_ptr = (struct myblock*)heap_space;

你应该声明

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

因此,您的malloc将返回myblockvar.buffer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM