C 将结构分配给字符数组

C 将结构分配给字符数组,c,malloc,free,C,Malloc,Free,我正试图创建自己的malloc,但我只停留在一点上。正如我们所知,我们必须将struct指定为可用空间中的元数据,如图中所述。 我有我的堆空间,它将成为我的“RAM”。现在我只想说一点:- 如何将我的结构 MyBooS/分配给 HeAPuSype ,还有一件事我们应该牢记,每次新请求到来时, MyBux/Cuff>的位置将按照分配的(请求的)空间来改变。 < P>如果你是C++,你应该使用 MyBuffsFrutyPtR = RealTytReST(HeAPHSLY);初始化空闲指针,然后初始

我正试图创建自己的
malloc
,但我只停留在一点上。正如我们所知,我们必须将
struct
指定为可用空间中的元数据,如图中所述。

我有我的
堆空间
,它将成为我的“RAM”。现在我只想说一点:-


如何将我的结构<代码> MyBooS/<代码>分配给<代码> HeAPuSype ,还有一件事我们应该牢记,每次新请求到来时, MyBux/Cuff>的位置将按照分配的(请求的)空间来改变。

< P>如果你是C++,你应该使用<代码> MyBuffsFrutyPtR = RealTytReST(HeAPHSLY);
初始化空闲指针,然后初始化
空闲\u ptr的
大小
下一个
上一个
缓冲区


在C中,您将使用常规的C样式转换,
struct myblock*free\u ptr=(struct myblock*)heap\u space

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

#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);
}
我想你应该换一种方式思考你的记忆,在你的堆空间里你可以有很多东西

如果你不明白什么,请问

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

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

  • 检查所需大小是否在阵列中可用
  • 如果您想实现您的应用程序,请留出一点空间 realloc
  • 实现你的自由功能
如果您在linux上,那么应该尝试使用brk/sbrk,而不是使用“堆空间”。但最重要的是使用自己的malloc运行“真正”的程序(使用LD_PRELOAD)

您应该声明

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

因此,您的malloc将使用
reinterpret\u cast
返回
myblockvar.buffer

?@Alexis它被标记为bothby使用这种初始化方式,我收到了while tmp->next not null struct myblock*tmp=heap\u space的无限循环//然后循环直到最后一个节点struct myblock*new_elem=tmp->next@user1642500我已经改变了循环谢谢@Alexis,你的指导确实帮助我找到了解决方案,虽然我的方法不同,但我理解“ram”初始化的主要问题已经解决了。结构myblock*new_elem=tmp;新要素->上一个=tmp;再次感谢timestruct myblock free_ptr=(struct myblock)heap_space;。通过使用这种方式,我只能在数组开始时拥有空间,但如何在第二次或第三次调用时捕获空间。如果您查看图片,了解908字节是如何空闲的,以及如何在arrayYes的这个位置上分配matadat,那么您必须计算您想要在缓冲区中的哪个位置分配matadat。我不是来给你做家庭作业的,但是你必须弄清楚怎么做数学题。一旦你有了一个指向缓冲区中正确位置的
char*
,你就可以使用我的答案了(虽然显然有人已经在另一个答案中做了你的家庭作业,所以我想知道为什么我有时会这么麻烦)。我正在享受暑假,利用空闲时间在电脑上学习新东西。。。作业它是从哪里来的?不管你问这个问题的原因是什么,你这样做是为了学习,对吗?你不会通过复制粘贴别人的代码来学习,除非你花了很多时间研究它是如何工作的。
struct myblock
    {
        struct myblock *next;
        struct myblock *prev;
        int size;
        char buffer[0];
    }