我正在尝试在预先分配的内存块中创建一个链接列表。简单地说,
-
我有一个像这样声明的初始内存池。
void *block = malloc(1000);
-
我从此池创建了链接列表的头部:
struct node *root = block;
-
假设初始块的内存地址为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代码,大小分配。
所以我想,您的代码没有错。