【发布时间】:2017-07-19 20:21:42
【问题描述】:
我正在尝试在预先分配的内存块中创建一个链表。简而言之,
-
我有一个这样声明的初始内存池。
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)
我做错了什么的任何线索?我尝试了几种不同的方法,但没有任何运气。
感谢您的宝贵时间!我非常感谢任何帮助。
【问题讨论】:
-
您没有展示如何从池中分配节点,而问题可能(应该?)出在那儿。
-
我对帖子进行了一些编辑。这样好一点吗?
-
您不是从池中为块分配空间,而是使用 malloc 分配新空间。您可以保留一个从根开始并按大小递增的计数器。另外,请提供您的整个代码,因为我们不知道 print_all 是做什么的。
-
我们还需要查看结构定义。
-
你会竭尽全力描述你自己的内存池,但从不使用它。我假设 'create_block' 设置了它,但你然后继续 malloc 你的节点。
标签: c list malloc heap-memory