c-如何使用指针将结构写入内存



我正在使用free-list实现一个内存管理器,它的节点是一个结构,包含关于要管理的内存块的元数据。

我将在一开始调用malloc()一次,从操作系统中获取一块内存。然后我会用我自己的程序来管理它。在随后的程序中,我不能再使用malloc()了,所以我必须将元数据(节点列表)保存在内存中。这是我的问题,假设:

struct list *node1 = malloc(n_bytes);   // only call malloc() once here
node1->memStart = node1 + sizeof(struct list)   // beginning address of managable
// memory
node1->size = bytes_allocated;
node1->used = 1;
node1->next = NULL;
// starting address of node2
struct list *node2 = node1->memStart + node1->size;      // used another node to track the second piece of
// that memory
node2->size = 4096; 
node2->used = 0;      // node2's memory is unused yet
node2->memStart = node2 + sizeof(struct list);
node2->next = NULL;
node1-next = node2;   // link them

因此,在这里,我不确定我是否已经将这些元数据(size,used,memStart,next)写入了从node1开始的内存地址,从而使其看起来像:

----------<----node1
|  size  |
----------
|  used  |
----------
|memStart|------|
----------      |
|  next  |      |
----------      |
|        |<-----|
|  mem   | 
|        |
----------<----node2
|  size  |
----------
|  used  |
----------
|memStart|
----------
|  next  |
----------
|        |
|  mem   | 
|        |
----------

所以我只是想知道在上面的代码之后,内存布局是否会像上面画的那样。它主要是关于node2的,我不确定是否可以像这样使用它来将元数据写入内存。这很重要,因为随着分配的内存越来越多,我需要更多的节点来跟踪它们。我认为在没有malloc的情况下实现这一点的方法(否则写我自己的管理器就没有意义了)是使用指针算法将内存分割成块,并使用开销来跟踪它们。

列表的结构应为:

struct list{
int size;
void *memStart;
int used;
struct list *next;
}

不,内存布局不会像上面画的那样。考虑这一行:

node1->memStart = node1 + sizeof(struct list)

由于指针运算,node1 + x将按sizeof(*node1)缩放x。也就是说,node1 + sizeof(struct list)产生指向node1 + sizeof(struct list)*sizeof(struct list)字节之外的地址的指针。这是C中的基本指针运算。您需要的是:

node1->memStart = ((char *) node1) + sizeof(struct list)

根据struct listmemStart的定义,这也可能是错误的:

struct list *node2 = node1->memStart + node1->size;

但是,如果您将memStart声明为char *,那么它应该可以工作,假设bytes_allocated(您没有显示它是如何获得的)是正确的。

该行与node1:的等效行具有相同的错误

node2->memStart = node2 + sizeof(struct list);

相关内容

  • 没有找到相关文章