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

标签 c pointers memory-management struct malloc

我正在使用空闲列表实现内存管理器,其节点是一个结构,其中包含有关要管理的内存块的元数据。

我会在最开始调用一次 malloc() 以从操作系统获取一 block 内存。然后我将使用我自己的程序来管理它。在后续程序中,我不能再使用 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 的情况下执行此操作的方法(否则编写我自己的管理器没有意义)是进行指针运算以将内存分成 block 并使用开销来跟踪它们。

列表的结构应该是:

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);

关于c - 如何使用指针将结构写入一 block 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777598/

相关文章:

c - 如何读取最后一个字符为 "n"的句子

c - 如何将链表从一个文件传递到同一项目中的另一个文件?

C 创建结构体指针

arrays - Swift:如何为 SKSpriteNodes 保留容量()

iphone - 由于使用保留属性而导致内存泄漏

c - 上采样的正确方法是什么?

c++ - openCV中的掩蔽

c - 指针扰乱了我的价​​值观

c++ - 使用 void *pointer to object 的安全性

c++ - 正确删除在别处分配的 std::list 中的指针