我正在尝试在预先分配的内存块中创建一个链表。简单地说,
我有一个这样声明的初始内存池。
void *block = malloc(1000);
我从这个池中创建了一个链表的头部:
struct node *root = block;
假设初始 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/