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

标签 c list malloc heap-memory

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

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

    void *block = malloc(1000);
    
  2. 我从这个池中创建了一个链表的头部:

    struct node *root = block;
    
  3. 假设初始 block 的内存地址是 100000。如果我添加一个大小为 100 的单个链表节点,这将从 100000 开始(因为它是第一个节点,共享第一个的内存地址堵塞)。如果我添加第二个大小为 200 的节点,它应该从 100100(在最后一个 block 的末尾)开始。下一个将从 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( block 开始) 25770205072(100 个节点的位置 - 这没问题) 25769968848(200 节点的位置 - 不正确。这应该是 25770205072 + 100) 25770204784(剩余 700 个内存节点的位置 - 不对。这应该是 25770205072 + 100 + 200)

我做错了什么的任何线索?我尝试了几种不同的方法,但都没有成功。

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

最佳答案

其实,这很简单。我从字面上使用了@Ajay Brahmakshatriya 提到的内容——“你可以保留一个从根开始并按大小递增的计数器”——并创建一个从根开始的新 long,每次都按大小递增。我没有将新节点设置为分配内存的新 blob,而是将其设置为旧地址 + 大小(并适当增加地址)。现在工作正常!谢谢!

关于C 链表 - 在内存块中创建节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515940/

相关文章:

java - 可以在Java中使用C头文件吗?

objective-c - 如何使用 Cocoa OSX SDK 检查 TCP 端口

C 对 | 使用 scanf()分隔字符串

list - 'List<void>'类型不是 'List<DropdownMenuItem<Client>>'类型的子类型

c - 在 Linux 上分配期间如何记录堆栈?

c - 了解与结构数组相关的 Malloc 和 Realloc

c - 使用 scanf 解析没有空格的字符串

java - 在两个列表中查找额外对象的最佳方法

.net - 使用大数组时,LinkedList 内存消耗与 List

c++ - 二维数组的 cudamalloc