C链接列表 - 在内存块中创建节点



我正在尝试在预先分配的内存块中创建一个链接列表。简单地说,

  1. 我有一个像这样声明的初始内存池。

    void *block = malloc(1000);
    
  2. 我从此池创建了链接列表的头部:

    struct node *root = block;
    
  3. 假设初始块的内存地址为100000。如果我添加一个尺寸100的单个链接列表节点,则仅在100000开始(因为这是第一个节点,共享第一个节点的内存地址堵塞)。如果我添加尺寸200的第二个节点,则应从100100开始(在最后一个块的末尾)。下一个将从100300开始,依此类推。

我将节点添加到列表中的方法可以凝结如下:

void add_node(int size) {
    new_node = malloc(sizeof(struct node));
    struct node *current = root;
    while (current != NULL) { //loop to get to the end of the linked list
        ...stuff (irrelevant to this question)...
        current = current->next;
    }
    new_node->value = size;
    current->next = new_node;
}

节点定义非常通用:

struct node {
   int value;
   int free;
   struct node *next;
};

主要方法如下:

int main(void) {
    create_block(1000);
    add_node(100);
    add_node(200);
    print_all();
}

和print_all简单地迭代并打印出内存地址:

void print_all() {
    printf("%ld (block start)n", block);
    struct node* current = root;
    while (current != NULL) {
        printf("%ld (%d)", current->value);
        current = current->next;
    }
}

但是,当添加具有值100和200的节点时,内存地址如下:

25770205072(块开始)25770205072(100节点的位置 - 可以)25769968848(200个节点的位置 - 不正常。这应该是25770205072 100)25770204784(其余700个内存节点的位置 - 不正常。这应该是25770205072 100 200)

有什么线索我做错了什么?我尝试了几种不同的方法。

感谢您的时间!非常感谢任何帮助。

实际上,这很简单。我从字面上使用了@ajay brahmakshatriya提到的内容 - "您可以将计数器保持在root上并按大小递增" - 并创建了一个从根开始的新长,并且每次都会按大小递增。我只是将新节点设置为分配的内存的新斑点,而只是将其设置为旧的地址 size(并适当地递增地址)。现在正常工作!谢谢!

警告:由于您没有显示池代码,这可能不是一个完整的解决方案,但是add_node有一些错误。

您必须设置new_node->next = NULL

在循环的末端,current可能是无效的,除非"无关紧要……"保证非零。在这种情况下,它不是无关紧要的。

您需要一个额外的变量(例如prev

还要注意,由于add_node正在调用malloc,因此它绕过您的内存池,因此您对地址的期望不能太多。

这是我认为您需要的[请原谅免费的清理风格]:

void
add_node(int size)
{
    struct node *new_node = malloc(sizeof(struct node));
    struct node *current;
    struct node *prev;
    // loop to get to the end of the linked list
    prev = root;
    for (current = root;  current != NULL;  current = current->next) {
        // ... stuff(irrelevant to this question) ...
        prev = current;
    }
    new_node->value = size;
    new_node->next = NULL;
    // NOTE: this assumes root is _always_ non-null
#if 0
    prev->next = new_node;
#else
    if (prev != NULL)
        prev->next = new_node;
    else
        root = new_node;
#endif
}

我只是尝试记住"链接列表"概念...它不同于阵列的每个阵列的阵列,而阵列的阵列在内存中与Elemen之前的接下来/相邻。

我认为每个节点"动态分配"。程序尝试找到仍然免费的内存,并且某些当前节点可以远离以前的节点。但是分配节点的大小块取决于我们如何编写malloc代码,大小分配。

所以我想,您的代码没有错。

相关内容

  • 没有找到相关文章

最新更新